【问题标题】:I want to group the columns of the matrix A which have the same value for the third line in Matlab我想对矩阵 A 的列进行分组,这些列在 Matlab 中的第三行具有相同的值
【发布时间】:2012-01-02 03:54:48
【问题描述】:

对于矩阵 A(4 行,1000 列)。我想对矩阵 A 的第三行具有相同值的列进行分组。所以我必须有第三行包含相同值的子矩阵。

例如:

如果:

A =

     1     4     5     2     2     2     2     1     1     5
     1     4     5     4     4     2     2     4     5     2
     3     3     3     3     4     1     3     5     3     4
     4     5     5     5     4     1     5     5     5     5

然后

A1 =

     1     4     5     2     2     1
     1     4     5     4     2     5
     3     3     3     3     3     3
     4     5     5     5     5     5

A2 =

     2     5
     4     2
     4     4
     4     5

A3 =

     2
     2
     1
     1

结果可以是单元格的形式。

【问题讨论】:

  • 看看sortrows()。它不会完全按照你的意愿做,但它会让你成为其中的一部分。

标签: matlab


【解决方案1】:

这是一种可能的黑客攻击(警告:我无法检查):

A =

 1     4     5     2     2     2     2     1     1     5
 1     4     5     4     4     2     2     4     5     2
 3     3     3     3     4     1     3     5     3     4
 4     5     5     5     4     1     5     5     5     5

specialRow=3;
unqCols = unique(A(specialRow,:));
numUnq = length(unqCols);
sepMats{numUnq}=[];

for i=1:numUnq
    sepMats{i} = A(:,A(specialRow,:)==unqCols(i));
end

【讨论】:

    【解决方案2】:

    在您显示的示例中,第 3 行有 4 个唯一元素,因此您应该获得 4 个子矩阵,但您只显示 3 个?

    这是一种方法:

    clear all;
    
    %data
    A = [1     4     5     2     2     2     2     1     1     5;
         1     4     5     4     4     2     2     4     5     2;
         3     3     3     3     4     1     3     5     3     4;
         4     5     5     5     4     1     5     5     5     5
         ]
    
    %engine
    row = 3;
    b   = unique(A(row,:));
    r   = arrayfun(@(i) A(:,A(row,:)==b(i)),1:length(b), 'UniformOutput',false);
    
    r{:}
    

    【讨论】:

      【解决方案3】:

      您可以使用ACCUMARRAY 在一行中进行分配:

      A = [1     4     5     2     2     2     2     1     1     5;
           1     4     5     4     4     2     2     4     5     2;
           3     3     3     3     4     1     3     5     3     4;
           4     5     5     5     4     1     5     5     5     5
           ];
      
      out = accumarray(A(3,:)', (1:size(A,2)), [], @(x){A(:,x)} );
      

      这样,out{i} 包含A 的所有列,其中A 的第三行等于i(如果没有有效列,则为空)。

      如果您希望out{i} 包含与A 第三行中第i 个最小唯一值对应的列,您可以先使用统计工具箱中的GRP2IDX

      [idx,correspondingEntryInA] = grp2idx(A(3,:)'); %'#
      out = accumarray(idx, (1:size(A,2)), [], @(x){A(:,x)} );
      

      这里,out{i} 包含与correspondingEntryInA(i) 对应的列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        • 2021-04-20
        • 2022-11-17
        • 1970-01-01
        • 1970-01-01
        • 2017-09-12
        相关资源
        最近更新 更多