我有矩阵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个作为最大值。
答案 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以获取Matrix2
和Matrix3
。如果您有类似
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