Arrays 分组运行顺序
我有一个包含组标识符的矩阵:Arrays 分组运行顺序,arrays,matlab,matrix,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循环的情况下做到这一点?谢谢大家! 输入包含正整数,不一定是连续的,但已排序 这项工作如下: 创建一个中间逻辑稀疏矩阵,列
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循环的情况下做到这一点?谢谢大家! 输入包含正整数,不一定是连续的,但已排序
这项工作如下:
A
确定,连续行位置:sparse(1:numel(A),A,true)
。虽然这个矩阵可能很大,但将其创建为稀疏矩阵可以提高内存效率true
条目移动到矩阵的上部:排序(…,1,'下降')
李>
[B,~]=find(…)
1
,2
李>
A
确定,连续行位置:sparse(1:numel(A),A,true)
。虽然这个矩阵可能很大,但将其创建为稀疏矩阵可以提高内存效率true
条目移动到矩阵的上部:排序(…,1,'下降')
李>
[B,~]=find(…)
1
,2
李>
这适用于非整数
[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]
这适用于非整数
[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]
最后一个是
3,2
?@OmG是的,谢谢!如果在运行3
'2之后出现新的2
,该怎么办?也就是说,A=[1;1;2;2;2;3;3;2]
的输出是什么?即使上述不可能,输入A=[2;2;1;1;1;3;3]
也可能吗?或者A=[1;1;4;4;5]
?有些方法可能会受益于对输入进行排序,或者没有间隙,或者每个值没有一次以上的运行。请说明这些限制是否适用于您的问题可能的副本是最后一个3,2
?@OmG是的,谢谢!如果在运行3
'2之后出现新的2
,该怎么办?也就是说,A=[1;1;2;2;2;3;3;2]
的输出是什么?即使上述不可能,输入A=[2;2;1;1;1;3;3]
也可能吗?或者A=[1;1;4;4;5]
?有些方法可能会受益于对输入进行排序,或者没有间隙,或者每个值没有一次以上的运行。请说明这些限制是否适用于您的问题。与您所述的假设相反,您的方法的可能副本似乎要求对输入矩阵A进行排序。这里它失败了:A=[2;1;2;3;3;1;3]。但没关系,我可以对矩阵进行排序。我还包括了一种稍微不同的方法,它适用于未排序的情况。在我看来,它也适用于不创建完整矩阵的情况,对于大型输入矩阵,速度要快得多。@bonifaz感谢您的更正(我使用full
进行调试,但忘记删除它)。我对其进行了编辑,并添加了一个解释。与您所陈述的假设相反,您的方法似乎要求对输入矩阵A进行排序。这里它失败了:A=[2;1;2;3;3;1;3]。但没关系,我可以对矩阵进行排序。我还包括了一种稍微不同的方法,它适用于未排序的情况。在我看来,它也适用于不创建完整矩阵的情况,对于大型输入矩阵,速度要快得多。@bonifaz感谢您的更正(我使用full
进行调试,但忘记删除它)。我已对其进行了编辑并添加了解释