如何交叉两个或多个矩阵?

时间:2014-03-22 21:57:50

标签: matlab matrix

假设我有一些具有非负条目的矩阵,N个矩阵例如具有相等大小的MxM。例如,我有3个矩阵如下:

A1=[2, 2, 0;
    2, 2, 0;
    0, 2, 0];


A2=[4, 0, 4;
    4, 3, 0;
    0, 0, 1];


A3=[2, 0, 0;
    1, 0, 3;
    3, 4, 3];

我想在matlab中找到A1,A2和A3的交集。这意味着我想得到以下矩阵:

 B=[-1,  2,  4;
    -1, -1,  3;
     3, -1, -1];

如果N个矩阵的(i,j)元素的交集,即元素A1(i,j),A2(i,j),A3(i,j),最多是一个非零数然后B(i,j)等于那个数字。否则,如果交集是至少两个数字,我输出-1,如我在前面的例子中所示。

如何在没有循环的matlab中执行此操作?

2 个答案:

答案 0 :(得分:3)

首先,连接到单个3D矩阵:

A=cat(3,A1,A2,A3)

然后计算非零元素,它给出了-1 - 元素的位置:

L=(sum(A~=0,3)>1)

最后,在那里L = 1我们想要一个-1,否则我们想要那个位置的单个元素,这是总和,因为其他元素是零:

L*-1+(1-L).*sum(A,3)

答案 1 :(得分:2)

我会这样做:

首先,计算所有矩阵中每个位置的非零元素:

foo = (A1 ~= 0) + (A2 ~= 0) + (A3 ~= 0);

接下来,找到那些具有多个非零元素的元素,并在结果中将它们设置为-1:

B = zeros(3,3);
B(foo > 1) = -1;

最后,找到非零元素(因为在我们关心的元素中只有一个非零元素,这与矩阵之和相同)

sumA = A1 + A2 + A3;

并将它们添加到结果矩阵

B(foo == 1) = sumA(foo == 1);