4

我有矩阵 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 到最大数字的每个数字),我希望有一个输出矩阵来指示此数字的序列,并且仅在原始矩阵中显示此数字。

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

4

3 回答 3

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

对于此示例,变量结果中将有 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

~edit~
如果按照评论中的要求,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
于 2012-07-24T15:27:44.643 回答
4

编辑因为问题改变了

这远非最佳,但会做你想做的事

 V = 1;
 C = A' == V;
 D = cumsum(C).*C
 E = D'

现在EMatrix1在您的示例中。更改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]

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

于 2012-07-24T15:17:15.450 回答
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
于 2012-07-24T15:19:13.803 回答