这与Matrices intersection几乎是同一个问题!
不同之处在于:如果所有矩阵的元素(i,j)的交集是相同的数字,则不输出-1但输出该数字。一个例子如下:
A1 = [2, 2, 0;
2, 2, 0;
0, 2, 0];
A2 = [2, 0, 4;
4, 3, 0;
0, 0, 1];
A3 = [2, 0, 0;
1, 0, 3;
3, 4, 3];
我想得到以下矩阵:
B = [2, 2, 4;
-1, -1, 3;
3, -1, -1];
答案 0 :(得分:1)
A1 = [2, 2, 0;
2, 2, 0;
0, 2, 0];
A2 = [2, 0, 4;
4, 3, 0;
0, 0, 1];
A3 = [2, 0, 0;
1, 0, 3;
3, 4, 3];
A=cat(3,A1,A2,A3);
%identify all fields with identical values on the 3rd dimension
[X,Y]=find(sum(abs(diff(A,1,3)),3)==0);
%delete all but the first repetition, then use the previous code
A(X,Y,2:end)=0;
L=(sum(A~=0,3)>1);
L*-1+(1-L).*sum(A,3)
/ update:必须修复代码,现在它应该是正确的。
答案 1 :(得分:1)
我会这样做
A = A1+A2+A3;
B = (A1==A2)&(A1==A3);
C = (A1==0)+(A2==0)+(A3==0);
D = ones(3)*-1;
D(B==1) = A1(B==1);
D(C==2) = A(C==2);
B
记录所有矩阵的编号相同的元素的位置。C
记录两个矩阵为0的元素的位置。然后,我们可以使用矩阵D
和B
中的信息修改C
的元素,其值最初设置为-1。
答案 2 :(得分:1)
版本1
out1 = -1.*(A1~=A2).*(A1~=A3).*(A2~=A3)
max_mat = max(cat(3,A1,A2,A3),[],3)
out1(~out1) = max_mat(~out1)
<强>输出强>
out1 =
2 2 4
-1 -1 3
3 -1 -1
版本2:可能是更快的版本
假设 - 如果在A1,A2和A3的相应位置中的三个元素中,只有两个相同,则将这三个元素的最大值取为最终矩阵B. / p>
<强>代码强>
%%// Concatenate all three A matrices
A=cat(3,A1,A2,A3,A1);
%%// Logical matrix with ones where all three elements are different from each other
out1 = -1.*all(diff(A,[],3)~=0,3)
%%// Get the max values, to be stored where -1 all three corresponding elements
%%// are not different from each other
max_mat = max(A,[],3)
%%// Get the final output
out1(~out1) = max_mat(~out1)
这将产生与先前版本相同的输出。
版本3
假设 - 如果在A1,A2和A3的相应位置中的三个元素中,只有两个相同,则取最后一个矩阵的元素与其他两个元素不同,乙
<强>代码强>
A=cat(3,A1,A2,A3,A1);
AA = A(:,:,1:3);
t1 = bsxfun(@ne,AA,mode(AA,3));
out1 = max(AA.*t1,[],3) + all(~t1,3).*A1;
out1(all(diff(A,[],3)~=0,3))=-1;
这会产生与先前版本相同的输出。