声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: fanzhenjie

[编程技巧] 请教:这个问题应该怎么控制呢?

[复制链接]
发表于 2008-12-2 10:46 | 显示全部楼层
原帖由 fanzhenjie 于 2008-12-2 09:55 发表
非常感觉楼上的呀,真的,很感谢你,你能不能帮我修改一下呀,现在要求变为:还是有一个N行三列的数据存储着一个曲面的坐标,现在按(1)Y从大小到排列;(2)对相同的Y来说,此时按X从大到小排列(或者从小到 ...

其实这一个,可以对比着上一个来修改。
~~~~~~~~~~~~~~~~~~~~~~~~~
clc
clear
% load data.txt
% x=data(:,1);
% y=data(:,2);
% z=data(:,3);
% clear data
% 实验数据
x=[1,2,3,4,5,6,7,8,9]';
y=[1,2,2,-1,3,3,-2,1,3]';
z=[1,2,5,4,3,6,7,5,3]';
[y1,IX] = sort(y,'descend');% 对z降序排列
x1=x(IX);
z1=z(IX);
yd=diff(y1);
a=[];
j=1;
str=cellstr(['ascend ';'descend']);
for i=1:length(yd)
    if yd(i)==0
        a=[a,i]; % 记录y相等的数的位置
    else
        if ~isempty(a) % 若存在y相等的情况,进行处理
            a=[a,max(a)+1];
            [xs1,IX1]=sort(x1(a),str{mod(j,2)+1}); % 对应y相等的x交替排序                     
            x1(a)=xs1; % 重组排列后的x
            yy1=y1(a); % 重组排列后的y
            y1(a)=yy1(IX1);
            zz1=z1(a); % 重组排列后的z
            z1(a)=zz1(IX1);
            a=[];
            j=j+1;
        end
    end
end
disp('原始数据:y|x|z');disp([y,x,z])
disp('重排数据:y|x|z');disp([y1,x1,z1])
~~~~~~~~~~~~~~~~~~~~~~
运行结果:
原始数据:y|x|z
     1     1     1
     2     2     2
     2     3     5
    -1     4     4
     3     5     3
     3     6     6
    -2     7     7
     1     8     5
     3     9     3
重排数据:y|x|z
     3     9     3
     3     6     6
     3     5     3
     2     2     2
     2     3     5
     1     8     5
     1     1     1
    -1     4     4
    -2     7     7
回复 支持 反对
分享到:

使用道具 举报

 楼主| 发表于 2008-12-2 11:23 | 显示全部楼层

回复 16楼 friendchj 的帖子

恩,谢谢你呀
 楼主| 发表于 2008-12-3 16:59 | 显示全部楼层

回复 16楼 friendchj 的帖子

我的数据在D盘,文件名为data.txt,我怎么把数据导入重新排序呀,谢谢!
 楼主| 发表于 2008-12-3 17:26 | 显示全部楼层

回复 16楼 friendchj 的帖子

我试一组数据,怎么不对呢?谢谢
原始数据:y|x|z
     2     1     1
     2    -1     2
     2     3     3
     2    -4     4
     2     2     5
     2    -3     6
     6    12     7
     6     2     8
     6    -5     9
     6     4     0
     3     2     1
     3    -2     7
     3     1     9
     3    -5    12

重排数据:y|x|z
     6    12     7
     6     4     0
     6     2     8
     6    -5     9
     3    -5    12
     3    -2     7
     3     1     9
     3     2     1
     2     1     1
     2    -1     2
     2     3     3
     2    -4     4
     2     2     5
     2    -3     6
发表于 2008-12-3 17:29 | 显示全部楼层

回复 18楼 fanzhenjie 的帖子

把data.txt和程序放在一个文件夹下就行。或者用完整的路径名,如load E:\data.txt
发表于 2008-12-3 18:47 | 显示全部楼层
原帖由 fanzhenjie 于 2008-12-3 17:26 发表
我试一组数据,怎么不对呢?谢谢

sorry,这是由于没有考虑特殊情况导致的,新改的程序如下:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
clc
clear
% load data.txt
% x=data(:,1);
% y=data(:,2);
% z=data(:,3);
% clear data
% 实验数据
data=[2 1 1;2 -1 2;2 3 3;2 -4 4;2 2 5;2 -3 6;...
     6 12 7;6 2 8;6 -5 9;6 4 0;3 2 1;3 -2 7;...
     3 1 9;3 -5 12];
y=data(:,1);
x=data(:,2);
z=data(:,3);
[y1,IX] = sort(y,'descend');% 对z降序排列
x1=x(IX);
z1=z(IX);
yd=diff(y1);
a=[];
j=1;
str=cellstr(['ascend ';'descend']);
for i=1:length(yd)
    if yd(i)==0
        a=[a,i]; % 记录y相等的数的位置
    else
        if ~isempty(a) % 若存在y相等的情况,进行处理
            a=[a,max(a)+1];
            [xs1,IX1]=sort(x1(a),str{mod(j,2)+1}); % 对应y相等的x交替排序                     
            x1(a)=xs1; % 重组排列后的x
            yy1=y1(a); % 重组排列后的y
            y1(a)=yy1(IX1);
            zz1=z1(a); % 重组排列后的z
            z1(a)=zz1(IX1);
            a=[];
            j=j+1;
        end
    end
    if i==length(yd)   % 判断最后的一组数据是否要重排
        if ~isempty(a) % 若存在y相等的情况,进行处理
            a=[a,max(a)+1];
            [xs1,IX1]=sort(x1(a),str{mod(j,2)+1}); % 对应y相等的x交替排序                     
            x1(a)=xs1; % 重组排列后的x
            yy1=y1(a); % 重组排列后的y
            y1(a)=yy1(IX1);
            zz1=z1(a); % 重组排列后的z
            z1(a)=zz1(IX1);
            a=[];
            j=j+1;
        end
    end  
      
end
disp('原始数据:y|x|z');disp([y,x,z])
disp('重排数据:y|x|z');disp([y1,x1,z1])
~~~~~~~~~~~~~~~~~~~~~~~
运行结果:
原始数据:y|x|z
     2     1     1
     2    -1     2
     2     3     3
     2    -4     4
     2     2     5
     2    -3     6
     6    12     7
     6     2     8
     6    -5     9
     6     4     0
     3     2     1
     3    -2     7
     3     1     9
     3    -5    12
重排数据:y|x|z
     6    12     7
     6     4     0
     6     2     8
     6    -5     9
     3    -5    12
     3    -2     7
     3     1     9
     3     2     1
     2     3     3
     2     2     5
     2     1     1
     2    -1     2
     2    -3     6
     2    -4     4
 楼主| 发表于 2008-12-3 22:09 | 显示全部楼层

回复 21楼 friendchj 的帖子

谢谢楼主的耐心指导,真的,很感谢你!对了,load能导入EXCEL数据吗?用什么指令能导入EXCEL数据呀!感觉你们懂的挺多!
发表于 2008-12-3 23:43 | 显示全部楼层

回复 22楼 fanzhenjie 的帖子

在本版搜索一下吧,或者help xlsread
 楼主| 发表于 2008-12-5 21:27 | 显示全部楼层

回复 21楼 friendchj 的帖子

假设我现在想这样排列这些数据一个数组Y存放着许多数,最大数为100,最小数不清楚哈,要自己判断,数据的个数也不清楚,得自己判断数组,我就想把其中大于等于95小于100的数变为(95+100)./2;大于等于90小于95的数变为(90+95)./2;大于等于85小于80的数变为(85+80)./2;依次类推,每个区间数的个数不确定,即95到100之间的数不一定和95到90之间的数相等,还有很多这样的数,应该怎么写循环呀,谢谢,我自己写了几句,肯定不对,也帮我看看吧!真的很感谢你,感觉自己学到了很多东西!我举了个例子
y=[100,99,98.4,96,95.3,94,92.5,91,90,89.4,86,85.4,85.2,84.3,8281.2,80.3,79,76,74,73];
ymin=95;
ymax=100;
if b=find((y>=ymin)&(y<ymax))
    y(b)=(ymax+ymin)./2;
else
    ymax=ymax-5;
    ymin=ymin-5;
end
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-17 19:41 , Processed in 0.075317 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表