我有矩阵A
A= [0 0 2 2 2 2 0 0 1 1 1 0 3 3;
2 2 2 2 0 0 1 1 1 0 0 3 3 0;
Run Code Online (Sandbox Code Playgroud)
如你所见,其中有连续的数字; 注意例如2 2 2 2第一行和第二行.
对于在该矩阵中出现的每个数字(或者至少对于从我的矩阵中的1到最大数字的每个数字),我想要一个输出矩阵,该矩阵指示该数字的序列,并且该数字仅在原始矩阵中.
例如,对于1:第一行有三个连续数字,第二行有三个:我想在第一个输出矩阵中指出这个,如下所示:
Matrix 1 = [ 0 0 0 0 0 0 0 0 1 2 3 0 0 0;
0 0 0 0 0 0 0 1 2 3 0 0 0 0]
Run Code Online (Sandbox Code Playgroud)
数字相同2:
Matrix 2 = [ 0 0 1 2 3 4 0 0 0 0 0 0 0 0;
1 2 3 4 0 0 0 0 0 0 0 0 0 0]
Run Code Online (Sandbox Code Playgroud)
并且3:
Matrix 3 = [ 0 0 0 0 0 0 0 0 0 0 0 0 1 2;
0 0 0 0 0 0 0 0 0 0 0 1 2 0]
Run Code Online (Sandbox Code Playgroud)
如您所见,每个输出矩阵显示连续出现的数字向前计数.
所以在这种情况下,我有3个输出矩阵,因为矩阵A有3个作为最大值.
你可以试试这个:
A= [0 0 2 2 2 2 0 0 1 1 1 0 3 3;
2 2 2 2 0 0 1 1 1 0 0 3 3 0];
result = arrayfun(@(b) (A == b).*cumsum((A == b),2),nonzeros(unique(A)), 'UniformOutput', false);
Run Code Online (Sandbox Code Playgroud)
对于此示例,变量结果中将有3个子矩阵.
result =
[2x14 double]
[2x14 double]
[2x14 double]
Run Code Online (Sandbox Code Playgroud)
要访问它们,请使用以下语法:
result{1}
result{2}
result{3}
Run Code Online (Sandbox Code Playgroud)
然后你得到:
ans =
0 0 0 0 0 0 0 0 1 2 3 0 0 0
0 0 0 0 0 0 1 2 3 0 0 0 0 0
ans =
0 0 1 2 3 4 0 0 0 0 0 0 0 0
1 2 3 4 0 0 0 0 0 0 0 0 0 0
ans =
0 0 0 0 0 0 0 0 0 0 0 0 1 2
0 0 0 0 0 0 0 0 0 0 0 1 2 0
Run Code Online (Sandbox Code Playgroud)
〜编辑〜
如果,如评论中所要求的,A是一个3D矩阵,这个代码的工作原理是一样的,但结果的结构有点不同:
result =
[2x14x2 double]
[2x14x2 double]
[2x14x2 double]
Run Code Online (Sandbox Code Playgroud)
要访问这些矩阵,请使用例如
result{1}(:,:,1) % for the results of comparing A(:,:,1) with value 1
result{1}(:,:,2) % for the results of comparing A(:,:,2) with value 1
Run Code Online (Sandbox Code Playgroud)