在 MATLAB 中对具有虚部的复数数组元素进行排序

Sorting the complex array elements with imaginary part along with it in MATLAB

我有一组数据点,它们是复数,假设有 8 行和 6 列。如果你看一下这个程序,你会发现数据集的排列非常随机。第 1、2、3 列没问题,但第 4 列有点异常。我的意思是说,在 B(5, 4) 处的元素(即 25.9868674011374)之后,它是 2.74257567017122 [B(6, 4)] 而不是 26.8410063269595 已经转到 B(6, 6)。我希望该列按升序排列(每次排序都应针对实际部分进行)。此外,在第 5 列中,尽管实部按升序排列,但虚部有点交换。例如,在 B(2,5) 之后应该是 B(3,6) 而不是 B(3,5)。我试过“排序”命令,但它无法正常工作。

对于想知道排序问题是什么的人,只需尝试 运行 这个命令:

A = [1+2i 3+i i 0 -i]; Dreal= sort(real(A)); Dimg = sort(imag(A));D=[Dreal;Dimg];

我要的是-i,0,i,3+I,1+2i,sort给的是别的。

此外,在某些情况下,第 4、5 和 6 列可能表现得“正常”,但第 1、2、3 列表现不正常。因此,即使第 4、5 和 6 列表现“正常”,我也希望它按升序排序。有办法解决这个问题吗?顺便说一下,我使用的是 Matlab-2015b。代码是:

clear all; clc;
B=[-2.14981736484179 + 0.00000000000000i,-1.38134547606946 + 0.00000000000000i,1.38451324569297 + 0.00000000000000i,22.5759136576435 + 0.00000000000000i,2.28536796878740 + 0.333911501246080i,2.28536796878740 - 0.333911501246080i;-2.22047322414157 + 0.00000000000000i,-1.43596350944258 + 0.00000000000000i,1.43889226552228 + 0.00000000000000i,23.4278498788255 + 0.00000000000000i,2.39484729461819 + 0.303429715954385i,2.39484729461819 - 0.303429715954385i;-2.29148887606605 + 0.00000000000000i,-1.49057388951113 + 0.00000000000000i,1.49328382360683 + 0.00000000000000i,24.2803021611395 + 0.00000000000000i,2.50423839041542 - 0.265225265037282i,2.50423839041542 + 0.265225265037282i;-2.36284412024645 + 0.00000000000000i,-1.54517861014711 + 0.00000000000000i,1.54768832224205 + 0.00000000000000i,25.1333019698605 + 0.00000000000000i,2.61351621914550 + 0.215386193278572i,2.61351621914550 - 0.215386193278572i;-2.43451884781340 + 0.00000000000000i,-1.59977935450756 + 0.00000000000000i,1.60210590260749 + 0.00000000000000i,25.9868674011374 + 0.00000000000000i,2.72266244928806 - 0.142395604889199i,2.72266244928806 + 0.142395604889199i;-2.50649346218904 + 0.00000000000000i,-1.65437753673930 + 0.00000000000000i,1.65653651325774 + 0.00000000000000i,2.74257567017122 + 0.00000000000000i,2.92075248853987 + 0.00000000000000i,26.8410063269595 + 0.00000000000000i;-2.57874914363635 + 0.00000000000000i,-1.70897433922564 + 0.00000000000000i,1.71097996266870 + 0.00000000000000i,2.74509085049068 + 0.00000000000000i,3.13593380433481 + 0.00000000000000i,27.6957188653678 + 0.00000000000000i;-2.65126800477853 + 0.00000000000000i,-1.76357074549849 + 0.00000000000000i,1.76543595943333 + 0.00000000000000i,2.78382099280761 + 0.00000000000000i,3.31458248082037 + 0.00000000000000i,28.5509993172157 + 0.00000000000000i];
k=1:1:4;
B1=sort(real(B));
B2=sort(imag(B));
B3=sort(B);

提前致谢。

您似乎想要 sort(A,'ComparisonMethod','real') 功能 available in Matlab r2017a,但要在 r2015b 中使用。

您可以使用 sortrows 函数重新创建特征:

clear
A = [1+2i 3+1i 1i 0 -1i];
AB = [real(A); imag(A)];
[~,I] = sortrows(AB');
Asort = A(I)

产量 Asort = [0 - 1i 0 + 0i 0 + 1i 1 + 2i 3 + 1i]sortrows 首先根据第一列对数组的每一行进行排序,然后断开与下一列的联系,依此类推,直到对整个数组进行排序(文档 here)。这里的想法是让第一列为实部,第二列为虚部。

对于高维复数数组,您有几种选择,但它们都将使用与上述相同的原理。如果要对矩阵 B 的所有元素进行排序,可以使用以下代码生成排序向量:

Bsep = [real(B(:)),imag(B(:))];
[~,I] = sortrows(Bsep);
SortedVec = B(I);

要重新整形为 8x6 数组(排序后的元素按列从左到右排列),只需添加以下行:

Bsort = reshape(SortedVec,8,6);

或者,您可能想要分别对数组的每一列进行排序。只需在循环中使用 sortrows

nCols = size(B,2);
Bsort = NaN(size(B));
for j = 1:nCols
   Bsep = [real(B(:,j)),imag(B(:,j))];
   [~,I] = sortrows(Bsep);
   Bsort(:,j) = B(I,j);
end

如果您想按虚数部分排序 first,然后与 real 部分分开,您需要做的就是在上面的任何代码片段中将调用的位置切换到 realimag。例如,

clear
A = [1+2i 3+1i 1i 0 -1i];
AB = [imag(A); real(A)]; % note that real and imag are switched
[~,I] = sortrows(AB');
Asort = A(I)

产量Asort = [0 - 1i 0 + 0i 0 + 1i 3 + 1i 1 + 2i]