首页 > 解决方案 > 按组运行顺序

问题描述

我有一个包含组标识符的矩阵:

A = [ 1 ; 1 ; 2;2;2;3;3]

我想通过按组运行序列来增强这一点,以获得这样的矩阵:

B = [ 1,1 ; 1,2 ; 2,1;2,2;2,3;3,1;3,2]

B =

 1     1
 1     2
 2     1
 2     2
 2     3
 3     1
 3     2

如果不使用可怕的 for 循环,我怎么能做到这一点?谢谢!

标签: arraysmatlabmatrix

解决方案


输入包含正整数,不一定是连续的但已排序

[B, ~] = find(sort(sparse(1:numel(A), A, true), 1, 'descend'));
B = [A B];

这工作如下:

  1. 创建一个中间逻辑稀疏矩阵,列位置由A连续行位置确定:sparse(1:numel(A), A, true)。尽管此矩阵可能很大,但将其创建为稀疏矩阵会使该方法具有内存效率。
  2. true每列中的条目移动到矩阵的上部:sort(..., 1, , 'descend')
  3. 行索引包含所需的结果:[B, ~] = find(...)

输入包含正整数,不一定是连续的,不一定是排序的

t = sparse(1:numel(A), A, true);
t = t.*cumsum(t, 1);
B = [A nonzeros(t.')];

这工作如下:

  1. 像以前一样创建一个中间逻辑稀疏矩阵。
  2. 在每一列中,用连续值替换非零值1, 2, ...
  3. 转置矩阵。线性顺序的非零是期望的结果。

推荐阅读