我有一个包含组标识符的矩阵:
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循环的情况下执行此操作?谢谢!
答案 0 :(得分:4)
[B, ~] = find(sort(sparse(1:numel(A), A, true), 1, 'descend'));
B = [A B];
其工作原理如下:
A
确定,并且连续的行位置:sparse(1:numel(A), A, true)
。尽管此矩阵可能很大,但将其创建为稀疏矩阵可以提高方法的存储效率。true
项移动到矩阵的顶部:sort(..., 1, , 'descend')
。 [B, ~] = find(...)
。t = sparse(1:numel(A), A, true);
t = t.*cumsum(t, 1);
B = [A nonzeros(t.')];
其工作原理如下:
1
,2
,... 答案 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]