【问题标题】:MATLAB: Sort a 3d array by another 3d arrayMATLAB:按另一个 3d 数组对 3d 数组进行排序
【发布时间】:2020-05-13 19:10:19
【问题描述】:

我有一个随机数的 3d 数组 A,我想分别对每个第 k 个维度进行排序:

A=rand(3,1,16);
[m, n, k]=size(A);

指示每个矩阵在第 3 维中的顺序的数组是 B:

B=randi(3,3,1,16); %this should be without replacement but think it will work anyway

如果 A(:,1,1)=[0.5, 0.2, 0.6]' 和 B(:,1,1)=[3,1,2] 那么有序的 A 应该是 [0.2, 0.6, 0.5 ]' 对每个 A(:,1,1:k) 以此类推。请注意,它不是以数字顺序排列 A。

A(B) 是我可能期望的工作并保持尺寸但不是正确的顺序。

我试图解决这个问题:https://uk.mathworks.com/matlabcentral/answers/307838-sort-3d-matrix-according-to-another-3d-matrix,但没有成功。

任何想法将不胜感激。

【问题讨论】:

    标签: arrays matlab sorting


    【解决方案1】:

    根据B 沿k-th 维度对A 进行排序:如果您的数据不复杂,一个简单的方法是:

    1. 将A 和B 打包成一个复数数组,其中A 是虚部,B 是实部;
    2. 根据实部沿k-th 维度排序;
    3. 保留虚部。

    这是在一行中完成的,如下所示:

    result = imag(sort(B+1j*A, k, 'ComparisonMethod', 'real'));
    

    示例:

    >> A = rand(2,4,3)
    A(:,:,1) =
       0.162182308193243   0.311215042044805   0.165648729499781   0.262971284540144
       0.794284540683907   0.528533135506213   0.601981941401637   0.654079098476782
    A(:,:,2) =
       0.689214503140008   0.450541598502498   0.228976968716819   0.152378018969223
       0.748151592823709   0.083821377996933   0.913337361501670   0.825816977489547
    A(:,:,3) =
       0.538342435260057   0.078175528753184   0.106652770180584   0.004634224134067
       0.996134716626885   0.442678269775446   0.961898080855054   0.774910464711502
    
    >> B = randi(9, size(A))
    B(:,:,1) =
         8     1     3     4
         8     4     8     9
    B(:,:,2) =
         2     2     8     5
         3     2     6     2
    B(:,:,3) =
         8     4     4     3
         6     5     1     2
    
    >> k = 2;
    
    >> result = imag(sort(B+1j*A, k, 'ComparisonMethod', 'real'))
    result(:,:,1) =
       0.311215042044805   0.165648729499781   0.262971284540144   0.162182308193243
       0.528533135506213   0.601981941401637   0.794284540683907   0.654079098476782
    result(:,:,2) =
       0.450541598502498   0.689214503140008   0.152378018969223   0.228976968716819
       0.083821377996933   0.825816977489547   0.748151592823709   0.913337361501670
    result(:,:,3) =
       0.004634224134067   0.078175528753184   0.106652770180584   0.538342435260057
       0.961898080855054   0.774910464711502   0.442678269775446   0.996134716626885
    

    【讨论】:

    • 如果你在虚部和A(即B+1j.*A)之间进行逐元素乘法会有什么不同(注意j和A之间的点)?
    • @kkuilla 结果是一样的,因为1j 是一个标量
    猜你喜欢
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2016-10-27
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 2022-09-23
    相关资源
    最近更新 更多