【问题标题】:Matlab Sort 3D Matrix By ColumnsMatlab 按列对 3D 矩阵进行排序
【发布时间】:2016-10-27 13:40:18
【问题描述】:

我正在尝试以 2x25x30 的形式对 3D 矩阵进行排序,并按 25 列的第二行进行排序,并执行 30 次。我尝试过使用排序功能得到各种结果。我不断得到一个 2x750x30 形式的新矩阵,使用索引对第二行进行排序。 我的数据看起来像 -( 1991 1992 1993; 1000 3200 2100) , (1991 1992 1993; 3400 7000 5500) 但在 2x25x30 矩阵。第一行是日历年,需要在最终输出中进行维护。排序基于第二行。谢谢!

【问题讨论】:

  • 按第二行排序是什么意思?您可以按第一个维度、第二个或第三个维度进行排序。
  • 提供一些创建数据和预期输出的代码可能会有所帮助。
  • 在 2x25x30 中,它是不是日历年的行,用作标题。在这个例子中,日历年是 1991、1992、1993。我不是在这一行上排序,而是在下面的行上排序。谢谢
  • 最终结果是 1991 1993 1992 ; 1000 2100 3200 和第二次迭代 1991 1993 1992; 3400 5500 7000。

标签: matlab sorting matrix multidimensional-array


【解决方案1】:

方法#1

A 作为输入数组,您可以使用broadcasting with bsxfun 帮助的线性索引-

[m,n,r] = size(A);
[~,idx] = sort(A(2,:,:))
idx2D = bsxfun(@plus,(idx-1)*m,(1:size(A,1))')
idx3D = bsxfun(@plus,idx2D,permute(m*n*(0:1),[1,3,2]))
out = A(idx3D)

样本输入、输出-

A(:,:,1) =
        1991        1992        1993
        1000        3200        2100
A(:,:,2) =
        1991        1992        1993
        3400        7000        5500
out(:,:,1) =
        1991        1993        1992
        1000        2100        3200
out(:,:,2) =
        1991        1993        1992
        3400        5500        7000

有了 MATLAB 2016B 中的自动广播,它看起来会整洁很多,就像这样 -

[m,n,r] = size(A);
[~,idx] = sort(A(2,:,:))
out = A((1:size(A,1))' + (idx-1)*m + permute(m*n*(0:r-1),[1,3,2]))

方法 #2

再次使用bsxfun,但这次使用二维重构数组上的列索引有助于避免第二次bsxfun-ing,就像这样 -

[m,n,r] = size(A);
[~,idx] = sort(A(2,:,:));
out = reshape(A(:,bsxfun(@plus,squeeze(idx),n*(0:r-1))),m,n,r)

【讨论】:

  • 方法 #2 太棒了!你能解释一下bsxfun 和squeeze 是如何与“reshape”一起工作的吗?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
相关资源
最近更新 更多