识别矩阵中相同数字的序列

Feb*_*ono 4 matlab matrix

我有矩阵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个作为最大值.

H.M*_*ter 8

你可以试试这个:

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)