按组运行顺序

时间:2019-10-14 09:27:40

标签: arrays matlab matrix

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

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循环的情况下执行此操作?谢谢!

2 个答案:

答案 0 :(得分:4)

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

[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. 在每一列中,用连续的值12,...
  3. 替换非零。
  4. 转置矩阵。线性顺序的非零是理想的结果。

答案 1 :(得分:0)

这适用于非整数。

[s, is] = sort(A)
[~, d] = cummax(s) ;
C(is, :) = (2:numel(A) + 1).'  -  d;
B = [A C] ;

如果输入已排序:

[~, d] = cummax(A) ;
C = (2:numel(A) + 1).'  -  d;
B = [A C]