matlab矩阵排序sort,Matlab ⽤sort函数排序
help⽂档中第⼀句就说明,可以⽤sort将参量中的元素按升序或降序排列~
格式:
B = sort(A) %沿着输⼊参量
A的不同维的⽅向、从⼩到⼤重新排列 A中的元素。A 可以是字符串的、实数的、复数的单元数组。对于 A 中完全相同的元素,则按它们在A
中的先后位置排列在⼀块;若 A 为复数的,则按元素幅值的从⼩到⼤排列,若有幅值相同的复数元素,则再按它们在区间[-π ,π
]的幅⾓从⼩到⼤排列;若 A 中有元素为NaN,则将它们排到最后。若
A为向量,则返回从⼩到⼤的向量,若A为⼆维矩阵,则按列的⽅向进⾏排列;若A为多维数组,sort(A)把沿着第⼀⾮单元集的元素像向量⼀样进⾏处理。
B=sort(A,dim) %沿着矩阵A中指定维数dim⽅向重新排列A中的元素。
[B,IX]=sort(A);
%其中IX是⼀个⼤⼩等于size(A)的数组,其每⼀列是A中列向量的元素相对应的置换位置记号。
举例:A = [ 3 3 5
0 4 2 ];
sort(A,1) %纵向排列
ans =
0 3 2
3 4 5
sort(A,2) %横向排列
ans =
3 3 5
0 2 4
>>A = [-1.9, -0.2, 3.1415926, 5.6,
7.0, 2.4+3.6i];
>>[B1,INDEX] = sort(A)
计算结果为:
B1 =
Columns 1 through 4
-0.2000 -1.9000 3.1416 2.4000 + 3.6000i
Columns 5 through 6
5.6000 7.0000
INDEX
=
2 1
3 6
4 5
由此可知,如果A与另⼀个矩阵C(char或cell)⼀⼀对应,如果⽤[B1,INDEX] =
sort(A)对A进⾏排序,则可以取得索引INDEX,进⽽可以查询B1中每个元素与C中哪⼀个对应。
-----------------------------------------------------------------------------
Matlab中给⼀维向量排序是使⽤sort函数:sort(A),排序是按升序进⾏的,其中A为待排序的向量;若欲保留排列前的索引,则可⽤
[sA,index] = sort(A)
,排序后,sA是排序好的向量,index 是 向量sA 中对 A 的索引。 索引使排列逆运算成为可能。
有久没有⽤Matlab都忘了。。。。。
事实上,这⾥A
≡sA(index) ,
[A恒等于sA(index)],这个结论确实很奇妙,⽽且很有⽤。不信你排序之后试下键⼊命令sA(index)
,看看得到的是不是就是排列前的A呢。[因为鸿1018问到这个问题,特此补写这⼀段] 2008-10-20 13:18
+
对于⼀般矩阵An*m(n,m均⼤于等于2),只要修正⼀下index的值,结论sA(index) ≡ A仍然成⽴,修正代码如下:s=size(A);
for k=1:s(2)
index(:,k)=index(:,k)+(k-1)*s(1);
end
-----------------------------------------------------------------------------------
在Matlab中排序某个向量(⼀维)时,可以使⽤sort(A),其中A为待排序的向量,如果仅是⽤来排序A,那么直接使⽤sort(A)即可,
如果排序后还需要保留原来的索引可以⽤返回值,即[B,ind]=sort(A),计算后,B是A排序后的向量,A保持不变,ind是B中每⼀项对应于A
中项的索引。排序是安升序进⾏的。
在Matlab中,访问矩阵中的元素,⼀维⽤A(1)访问向量A的第⼀个元素;(下标从1开始);⼆维⽤A(1,2)访问A中第⼀⾏,第⼆列的元素。
由于在sort函数的结果中,是安升序排序的,要转换成降序,先⽤X=eye(n)⽣成⼀个n维的单位阵,然后⽤X=rot90(X)将其旋转为次对⾓线的单位阵,再⽤原来矩阵乘以X即可,如要讲A逆序排列采⽤如下步骤:
X=eye(size(A));
X=rot90(X);
A=A*X;
假如a是⼀个2*n的矩阵,即两⾏.
b=a(1,:);
[c,pos]=sort(b);%pos为排序后的下标,c为第⼀⾏的排序结果;
a(2,:)=a(2,pos);%第⼆⾏按照第⼀⾏排序的下标对应
a(1,:)=c;%第⼀⾏结果重新赋给a 的第⼀⾏
以下适⽤于m*n的矩阵按第⼀⾏排序
[ b, pos ] = sort( a( 1, : ) );
a = a( :, pos );
------------------------------------------------
主要是前⼀篇在实现⼏种编码的时候遇到了好些问题。
1.元胞数组
因为要⽣成各个符号的码字,他们的长度都不⼀样,
没法⽤⼀般的矩阵来存。
c = cell(5,2)
c{1,1} = 1
反正⽤cell创建,⽤{}引⽤就是了。
另外,把若⼲字符串连接成⼀个元胞数组:
strvcat('Hello','Yes')
(特别鸣谢yhsa678同学的指点)
2.for循环
matlab的for让⼈觉得很不爽。
c:
for ( i = 1 ; i <= n ; i ++ ){...}
vb:
for i = 1 to n
...
next i
pascal:
for i := 1 to n begin
...
sort命令排序end
以上的东西执⾏完后,i的值都是n+1
但是,matlab的for i = 1:n完了之后!
i == n
。。。这在平时真的没啥。。但在有的时候,就要增加点编码了,很烦。⽐如这个例⼦:
我们要寻数组中有没有0。有0就⼲什么事,没有就⼲什么事。
x = [1 3 2] ;
for i = 1:3
if x(i) ==
break ;
end
end
这个完了之后,如果i==3,
那么你就⽆法确定是因为3好元素是0,break掉的。
还是循环执⾏完了,i停在3的。
所以相⽐前⼏种语⾔来说,这个设计实在是不爽。。
只有多加点东西:
x = [1 3 2] ;
has0 = 0 ;
for i = 1:3
if x(i) ==
has0 = 1
break ;
end
end
if has0
..
else
..
end
3.sort
第⼀个就是,sort是从⼩到⼤,那么从⼤到⼩就有点囧了。
可以⽤逆置数组的办法来完成:
p = sort(p)
p = fliplr(p)
这下就是从⼤到⼩了。
fliplr是左右逆置。
还有个flipud是上下逆置。
第⼆个就是,sort的返回值确实很有⽤处,当年还不会matlab的时候在这⾥看到过。今天做编码的时候,有两个要先从⼤到⼩排序再处理。
但是处理完之后交回调⽤者的码字应该是按照原顺序排的。
这个时候,就好利⽤sort的返回值了。
>> x = [ 3 1 2]
x =
3 1 2
>> [y i] = sort(x)
y =
1 2 3
i =
2 3 1
执⾏完后,有这个关系:y = x(i)
⽐如,调⽤这要求得到的c是对应于以前的x的。
但我们处理的时候,是基于排序后的y的。那么这时得到的c。应该做个处理:c(i) = c ;
这下就OK了。
------------------------------------------------------

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。