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

时间:2012-07-24 14:57:06

标签: 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;

如您所见,其中有连续的数字;例如,注意第一行和第二行的2 2 2 2

对于此矩阵中出现的每个数字(或者至少对于我的矩阵中从1到最大数字的每个数字),我想要一个输出矩阵,指示此数字的序列,此数字仅在原始矩阵中。< / p>

例如,对于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]

数字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]

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]

正如您所看到的,每个输出矩阵都会显示连续出现的数字。

所以在这种情况下,我有3个输出矩阵,因为矩阵A有3个作为最大值。

3 个答案:

答案 0 :(得分: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);

对于此示例,变量result中将有3个子矩阵。

result = 

    [2x14 double]
    [2x14 double]
    [2x14 double]

要访问它们,请使用以下语法:

result{1}
result{2}
result{3}

然后你得到:

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

<强>〜编辑〜
如果按照评论中的要求,A是一个3D矩阵,这段代码的工作原理是一样的,但结果的结构有点不同:

result = 
    [2x14x2 double]
    [2x14x2 double]
    [2x14x2 double]

要访问这些矩阵,请使用例如

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

答案 1 :(得分:4)

编辑,因为问题已更改

这远远不是最佳,但会做你想做的事情

 V = 1;
 C = A' == V;
 D = cumsum(C).*C
 E = D'
在您的示例中,

现在E将为Matrix1。将V更改为2和3以获取Matrix2Matrix3。如果您有类似

的内容
 A = [2 2 2 0 0 0 0 0 2 2 2] 

然后你会得到

 [1 2 3 0 0 0 0 0 4 5 6]

所以它可能不是你想要的。从你的问题不清楚是否是这种情况,但如果没有告诉我,我将删除答案

答案 2 :(得分:4)

这是一个基于循环的解决方案,可以帮助您入门:

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
];

mx = max(A(:));
AA = cell(mx,1);
for num=1:mx
    AA{num} = zeros(size(A));
    for r=1:size(A,1)
        idx = ( A(r,:) == num );
        AA{num}(r,idx) = sum(idx):-1:1;
    end
end

结果:

>> AA{1}
ans =
     0     0     0     0     0     0     0     0     3     2     1     0     0     0
     0     0     0     0     0     0     3     2     1     0     0     0     0     0
>> AA{2}
ans =
     0     0     4     3     2     1     0     0     0     0     0     0     0     0
     4     3     2     1     0     0     0     0     0     0     0     0     0     0
>> AA{3}
ans =
     0     0     0     0     0     0     0     0     0     0     0     0     2     1
     0     0     0     0     0     0     0     0     0     0     0     2     1     0

编辑:

更新了用于处理三维矩阵的代码:

A = zeros(2,7,2);
A(:,:,1) = [2 2 2 0 0 1 1 ; 0 0 2 2 2 1 1];
A(:,:,2) = [1 1 2 2 2 0 0 ; 0 1 1 0 2 2 2];

mx = max(A(:));
AA = cell(mx,1);
for num=1:mx
    AA{num} = zeros(size(A));
    for p=1:size(A,3)
        for r=1:size(A,1)
            idx = ( A(r,:,p) == num );
            AA{num}(r,idx,p) = 1:sum(idx);
        end
    end
end

结果:

%# contains consecutive numbers corresponding to number 1 in all slices
>> AA{1}
ans(:,:,1) =
     0     0     0     0     0     1     2
     0     0     0     0     0     1     2
ans(:,:,2) =
     1     2     0     0     0     0     0
     0     1     2     0     0     0     0

%# contains consecutive numbers corresponding to number 2 in all slices
>> AA{2}
ans(:,:,1) =
     1     2     3     0     0     0     0
     0     0     1     2     3     0     0
ans(:,:,2) =
     0     0     1     2     3     0     0
     0     0     0     0     1     2     3