【问题标题】:sortrows in the 2nd dimension of 3d matrix在 3d 矩阵的第二维排序
【发布时间】:2015-08-05 10:12:15
【问题描述】:

我试图在 Matlab 中对 3d 矩阵的第二维中的第一行进行排序,但 sortrows() 在这种情况下不起作用。

例如,我有一个类似的矩阵

a(:,:,1)
1 2 4
3 1 6
2 0 5

a(:,:,2)
3 5 6
1 2 4
0 2 2

我需要得到结果

a(:,:,1)
1 2 4
2 0 5
3 1 6

a(:,:,2)
0 2 2
1 2 4
3 5 6

有没有一种有效的方法来实现这一目标?非常感谢!

【问题讨论】:

    标签: arrays matlab matrix multidimensional-array


    【解决方案1】:

    如果我理解正确,您希望根据第一个 的值。

    [m,n,p] = size(a);
    [~, row_ind] = sort(a(:,1,:), 1);
    lin_ind = bsxfun(@plus, bsxfun(@plus, row_ind, (0:n-1)*m), reshape((0:p-1)*m*n, 1, 1, p));
    result = a(lin_ind);
    

    这是如何工作的

    沿第一个维度(行)对a(:,1:,) 进行排序,并获取排序的索引(使用sort 的第二个输出;第2 行)。根据这些行索引,生成linear indices(使用bsxfun;第3 行),它会给出所需的结果(第4 行)。

    示例

    输入

    a(:,:,1) = [1 2 4
                3 1 6
                2 0 5];
    a(:,:,2) = [3 5 6
                1 2 4
                0 2 2];
    

    这会产生

    result(:,:,1) =
         1     2     4
         2     0     5
         3     1     6
    result(:,:,2) =
         0     2     2
         1     2     4
         3     5     6
    

    【讨论】:

    • 这应该是完美的解决方案。漂亮:)
    • @SanthanSalai 谢谢!!
    【解决方案2】:

    只需对每个二维矩阵使用sortrows

    a(:,:,1)=sortrows(a(:,:,1));
    a(:,:,2)=sortrows(a(:,:,2));
    

    当然可以循环执行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-02
      • 2015-01-31
      • 2013-07-03
      • 2011-03-19
      • 2015-09-17
      • 1970-01-01
      • 2021-12-31
      • 2020-08-15
      相关资源
      最近更新 更多