matlab中矩阵的交集?

时间:2014-03-26 19:12:34

标签: matlab matrix

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

3 个答案:

答案 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的元素的位置。

然后,我们可以使用矩阵DB中的信息修改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;

这会产生与先前版本相同的输出。