fanzhenjie 发表于 2008-11-30 23:12

请教:这个问题应该怎么控制呢?

我有一个曲面的所以所有空间三维坐标点存储在一个N行三列的矩阵a中,现在我需要对这个矩阵,即这些点的输出顺序进行如下处理:(1)按Z从大到小排列所有坐标点;(2)对于相同Z的坐标点,当Y>0时,按X从大到小排列,当Y<0时,按X从小到大排列,即对于取定的Z来说,先按X从大到小排列Y大于0的数,再接着按X从小到大排列Y小于0的数,这样保证X是一个环形!大家帮我想想这个应该如何写这个控制程序呀,想了很久没有想出来!谢谢大家!

friendchj 发表于 2008-11-30 23:27

说一下我的思路:
1.用sort函数对Z排序;
2.对排序后的Z,用diff做差分,得结果为Zd;
3. 寻找Zd中的零,如:1 0 0 2 0 3 0 0 0, 把 连零如“0 0”,“0”“0 0 0”分别看成一组;
4.对每一组按Y大于零和Y小于零归类;
5. 对Y大于零的X和Y小于零的X分别排列

fanzhenjie 发表于 2008-12-1 08:22

回复 沙发 friendchj 的帖子

恩,别人给我用VC语言弄的,可是我自己不怎么会VC,想用MATLAB语言弄一下,能不能帮我写上几段代码呀?十分感谢!就假设矩阵a为N行三列吧!

ChaChing 发表于 2008-12-1 11:35

回复 楼主 fanzhenjie 的帖子

可否给数据, 我想试一下
or
楼主自个儿试试
= cart2pol(x,y,z);
bb= ;bb=sortrows(bb,); bb(:,3)=-bb(:,3);
= pol2cart(bb(:,1),bb(:,2),bb(:,3)); bb=;

[ 本帖最后由 ChaChing 于 2008-12-1 11:40 编辑 ]

fanzhenjie 发表于 2008-12-1 13:22

回复 地板 ChaChing 的帖子

数据如下:-16.56878 7.65360 0.98083
-16.27185 7.55934 0.93800
-15.97493 7.45182 0.89518
-15.67800 7.33046 0.85235
-15.38107 7.19456 0.80953
-15.08414 7.04328 0.76670
-14.78722 6.87559 0.72387
-14.49029 6.69028 0.68105
-14.19336 6.48582 0.63822
-13.89643 6.26034 0.59539
-13.59951 6.01148 0.55257
-13.30258 5.73620 0.50974
-13.00565 5.43047 0.46691
-12.70872 5.08882 0.42409
-12.41180 4.70341 0.38126
-12.11487 4.26241 0.33844
-11.81794 3.74622 0.29561
-11.52101 3.11773 0.25278
-11.22409 2.28610 0.20996
-10.92716 0.74318 0.16713
-25.19395 0.99659 2.12382
-24.89702 2.18615 2.08099
-24.60010 2.89573 2.03817
-24.30317 3.43676 1.99534
-24.00624 3.88038 1.95251
-23.70931 4.25716 1.90969
-23.41239 4.58361 1.86686
-23.11546 4.86985 1.82403
-22.81853 5.12265 1.78121
-22.52160 5.34673 1.73838
-22.22468 5.54559 1.69556
-21.92775 5.72186 1.65273
-21.63082 5.87756 1.60990
-21.33390 6.01429 1.56708
-21.03697 6.13333 1.52425
-20.74004 6.23569 1.48142
-20.44311 6.32217 1.43860
-20.14619 6.39343 1.39577
-19.84926 6.44996 1.35294
-19.55233 6.49215 1.31012
-19.25540 6.52028 1.26729
-18.95848 6.53453 1.22447
-18.66155 6.53499 1.18164
-18.36462 6.52167 1.13881
-18.06769 6.49447 1.09599
-17.77077 6.45323 1.05316
-17.47384 6.39768 1.01033
-17.17691 6.32743 0.96751
-16.87998 6.24198 0.92468
-16.58306 6.14072 0.88185
-16.28613 6.02283 0.83903
-15.98920 5.88732 0.79620
-15.69227 5.73293 0.75338
-15.39535 5.55811 0.71055
-15.09842 5.36084 0.66772
-14.80149 5.13855 0.62490
-14.50456 4.88781 0.58207
-14.20764 4.60399 0.53924
-13.91071 4.28051 0.49642
-13.61378 3.90753 0.45359
-13.31685 3.46913 0.41076
-13.01993 2.93614 0.36794
-12.72300 2.24209 0.32511
-12.42607 1.11937 0.28229
-23.42666 0.34689 1.76788
-23.12974 1.68118 1.72506
-22.83281 2.31353 1.68223
-22.53588 2.77461 1.63941
-22.23895 3.14078 1.59658
-21.94203 3.44246 1.55375
-21.64510 3.69548 1.51093
-21.34817 3.90930 1.46810
-21.05124 4.09007 1.42527
-20.75432 4.24202 1.38245
-20.45739 4.36815 1.33962
-20.16046 4.47066 1.29680
-19.86353 4.55114 1.25397
-19.56661 4.61073 1.21114
-19.26968 4.65026 1.16832
-18.97275 4.67022 1.12549
-18.67582 4.67087 1.08266
-18.37890 4.65221 1.03984
-18.08197 4.61401 0.99701
-17.78504 4.55578 0.95418
-17.48811 4.47674 0.91136
-17.19119 4.37575 0.86853
-16.89426 4.25126 0.82571
-16.59733 4.10113 0.78288
-16.30040 3.92241 0.74005
-16.00348 3.71098 0.69723
-15.70655 3.46084 0.65440
-15.40962 3.16282 0.61157
-15.11269 2.80170 0.56875
-14.81577 2.34852 0.52592
-14.51884 1.73251 0.48309
-14.22191 0.55464 0.44027
-19.58088 0.59141 1.11217
-19.28395 0.84605 1.06934
-18.98703 0.94965 1.02651
-18.69010 0.95283 0.98369
-18.39317 0.85670 0.94086
-18.09624 0.61642 0.89803
-23.13037 -1.37833 1.72067
-22.83344 -2.10377 1.67784
-22.53651 -2.60228 1.63502
-22.23959 -2.98964 1.59219
-21.94266 -3.30514 1.54937
-21.64573 -3.56791 1.50654
-21.34880 -3.78894 1.46371
-21.05188 -3.97518 1.42089
-20.75495 -4.13136 1.37806
-20.45802 -4.26077 1.33523
-20.16109 -4.36580 1.29241
-19.86417 -4.44817 1.24958
-19.56724 -4.50913 1.20675
-19.27031 -4.54954 1.16393
-18.97338 -4.56994 1.12110
-18.67646 -4.57060 1.07828
-18.37953 -4.55153 1.03545
-18.08260 -4.51248 0.99262
-17.78567 -4.45293 0.94980
-17.48875 -4.37202 0.90697
-17.19182 -4.26856 0.86414
-16.89489 -4.14085 0.82132
-16.59796 -3.98657 0.77849
-16.30104 -3.80247 0.73566
-16.00411 -3.58396 0.69284
-15.70718 -3.32428 0.65001
-15.41025 -3.01279 0.60719
-15.11333 -2.63114 0.56436
-14.81640 -2.14219 0.52153
-14.51947 -1.44049 0.47871
-25.19458 -0.25981 2.11943
-24.89766 -1.96304 2.07660
-24.60073 -2.73122 2.03378
-24.30380 -3.29934 1.99095
-24.00687 -3.75921 1.94813
-23.70995 -4.14701 1.90530
-23.41302 -4.48149 1.86247
-23.11609 -4.77387 1.81965
-22.81917 -5.03148 1.77682
-22.52224 -5.25946 1.73399
-22.22531 -5.46149 1.69117
-21.92838 -5.64039 1.64834
-21.63146 -5.79828 1.60551
-21.33453 -5.93684 1.56269
-21.03760 -6.05740 1.51986
-20.74067 -6.16102 1.47704
-20.44375 -6.24853 1.43421
-20.14682 -6.32062 1.39138
-19.84989 -6.37779 1.34856
-19.55296 -6.42046 1.30573
-19.25604 -6.44890 1.26290
-18.95911 -6.46331 1.22008
-18.66218 -6.46378 1.17725
-18.36525 -6.45031 1.13442
-18.06833 -6.42281 1.09160
-17.77140 -6.38111 1.04877
-17.47447 -6.32492 1.00595
-17.17754 -6.25385 0.96312
-16.88062 -6.16739 0.92029

fanzhenjie 发表于 2008-12-1 13:24

回复 地板 ChaChing 的帖子

帮我试试呀,谢谢!

ChaChing 发表于 2008-12-1 14:01

程序不是已附上了!? 我是依据楼主1F的需求, 不知是否是楼主要的
但直觉楼主的需求与1F的logic不同?

friendchj 发表于 2008-12-1 16:19

原帖由 friendchj 于 2008-11-30 23:27 发表 http://www.chinavib.com/forum/images/common/back.gif
说一下我的思路:
1.用sort函数对Z排序;
2.对排序后的Z,用diff做差分,得结果为Zd;
3. 寻找Zd中的零,如:1 0 0 2 0 3 0 0 0, 把 连零如“0 0”,“0”“0 0 0”分别看成一组;
4.对每一组按Y大于零和Y小于零归 ...
按这个思路写的程序:
clc
clear
% load data.txt
% x=data(:,1);
% y=data(:,2);
% z=data(:,3);
% clear data
% 实验数据
x=';
y=';
z=';
= sort(z,'descend');% 对z降序排列
x1=x(IX);
y1=y(IX);
zd=diff(z1);
a=[];
for i=1:length(zd)
    if zd(i)==0
      a=; % 记录z相等的数的位置
    else
      if ~isempty(a) % 若存在z相等的情况,进行处理
            a=;
            ind1=find(y1(a)>=0); % 按y大于0和y小于0归类
            ind2=find(y1(a)<0);
            =sort(x1(a(ind1)),'descend'); % 对应y大于0的x降序排列
            =sort(x1(a(ind2)));% 对应y小于0的x升序排列               
            x1(a)=; % 重组排列后的x
            yy1=y1(a(ind1)); % 重组排列后的y
            yy2=y1(a(ind2));
            y1(a)=;
            a=[];
      end
    end
end
disp('原始数据:z|y|x');disp()
disp('重排数据:z|y|x');disp()
~~~~~~~~~~~~~~~~~~~~~~~
运行结果:
原始数据:z|y|x
   1   1   1
   2   2   2
   2   3   3
   4    -1   4
   5   3   5
   6   4   6
   6    -2   7
   6    -1   8
   3   3   9
重排数据:z|y|x
   6   4   6
   6    -2   7
   6    -1   8
   5   3   5
   4    -1   4
   3   3   9
   2   3   3
   2   2   2
   1   1   1

fanzhenjie 发表于 2008-12-1 16:59

回复 8楼 friendchj 的帖子

谢谢呀,恩,应该是这样的,十分感谢呀!

fanzhenjie 发表于 2008-12-1 23:39

回复 8楼 friendchj 的帖子

非常感觉楼上的呀,真的,很感谢你,你能不能帮我修改一下呀,现在要求变为:还是有一个N行三列的数据存储着一个曲面的坐标,现在按(1)Y从大小到排列;(2)对相同的Y来说,此时按X从大到小排列(或者从小到大排列),但当取下一个Y值时(Y递增变化一个量时),X便应从小到大排列(或者从大到小排列),依次这样循环。可以理解为假设有K个不同的Y值,对于同一Y值,则当K取奇数时按X从大到排列,K取偶数时按X从小到大排列。

fanzhenjie 发表于 2008-12-1 23:41

回复 8楼 friendchj 的帖子

a=; % 记录z相等的数的位置
a=;
这样操作后a取什么值了呀,不明白呀,这是矩阵什么运算呢,谢谢!

ChaChing 发表于 2008-12-1 23:47

非常抱歉! 我试了下资料後, 才发现错了离谱!
本想转变至极座标, 直接对幅角排序即可!
刚刚才发现这不对, 我忽略了 rho并非常数!
再次向楼主抱歉!

friendchj 发表于 2008-12-2 09:18

原帖由 fanzhenjie 于 2008-12-1 23:41 发表 http://www.chinavib.com/forum/images/common/back.gif
a=; % 记录z相等的数的位置
a=;
这样操作后a取什么值了呀,不明白呀,这是矩阵什么运算呢,谢谢!
a=; 记录的是zd中为零的位置,由于zd是z差分后的结果,所以如果假设a=2,对应zd的位置为2,但对应z中的位置则为2,3

fanzhenjie 发表于 2008-12-2 09:43

回复 12楼 ChaChing 的帖子

没有关系的哈,呵呵,在学习中进步!很感谢大家!

fanzhenjie 发表于 2008-12-2 09:55

回复 13楼 friendchj 的帖子

非常感觉楼上的呀,真的,很感谢你,你能不能帮我修改一下呀,现在要求变为:还是有一个N行三列的数据存储着一个曲面的坐标,现在按(1)Y从大小到排列;(2)对相同的Y来说,此时按X从大到小排列(或者从小到大排列),但当取下一个Y值时(Y递增变化一个量时),X便应从小到大排列(或者从大到小排列),依次这样循环。可以理解为假设有K个不同的Y值,对于同一Y值,则当K取奇数时按X从大到排列,K取偶数时按X从小到大排列。
页: [1] 2
查看完整版本: 请教:这个问题应该怎么控制呢?