如何通过引用矩阵中的坐标来执行逻辑AND操作

时间:2016-07-27 17:10:19

标签: matlab matrix logical-operators

矩阵A包含不同坐标中的1:

A =
 1     0     0     0     1     0     0     0     0     0
 0     1     0     0     0     1     0     0     1     0
 0     0     1     0     0     0     1     0     0     1
 0     0     0     1     0     0     0     0     0     0
 0     0     0     0     0     0     0     1     0     0

第1步: 找到1的坐标。例如,在第一行中它是(1,1)和(1,5)。

c1 = find(A==1)

第2步: 在Main M矩阵中扫描此坐标并执行AND操作。如果答案为1,则将1放在A矩阵的相应坐标中。例如,(1,1) (1,5)矩阵中的M(2,1)(2,5)==> 1 1 ANDed 0 0 ==>0 0进行AND运算。同样在(3,1) (3,5)矩阵中(10,1) (10,5)M。如果任何地方1,它将1放在A矩阵中的相应坐标位置。

M =
 1     0     0     0     1     1     1     1     1     1
 0     1     0     0     0     1     1     1     1     1
 0     0     1     0     1     1     1     1     1     1
 0     0     0     1     0     0     0     0     1     1
 1     0     1     0     1     0     0     0     0     0
 1     1     1     0     0     1     0     0     1     1
 1     1     1     0     0     0     1     0     1     1
 1     1     1     0     0     0     0     1     0     0
 1     1     1     1     0     1     1     0     1     0
 1     1     1     1     0     1     1     0     0     1

此处在第4行A矩阵的给定矩阵中,1(4,4)检查M矩阵中的剩余坐标。它与(1,4)和(2,4)进行正比,而(9,4)则为1.将1放在A矩阵(4,9)中。我已尝试使用代码,但它不适用于通用情况。

a = 1:size(M)
R1 = 1;
for j = 1:size(A)
    A1 = A(j,:)
    c = find(A1==1) % finding 1's place
    l = length(c)
    a1 = a(a~=j)
    for k = a1(1):a1(end)
        R1 = 1;
        for i = 1:l1
            temp1 = R1
            R1 = and(M(j,c(i)),M(k,c(i)))  % performing AND operations
            R2 = and(R1,temp1)
        end
        if (R2==1)     % if the condition is satisfied by 1
            A(j,k)=1   % place the 1 in the particular coordinate in A matrix
        end
    end
end
New_A = A

New_A =
 1     0     0     0     1     0     0     0     0     0
 0     1     0     0     0     1     0     0     1     0
 0     0     1     0     0     0     1     0     0     1
 0     0     0     1     0     0     0     0     1     0
 1     0     0     0     0     0     0     1     0     0

1 个答案:

答案 0 :(得分:0)

如果我理解了您的问题,那么对于r的每一行A,您要提取M所有A(r,:)==1列,然后将1放入c的第一列A(r,:),即提取的c中行M中的所有列均为1.使用更新的A继续同一行上的过程直到你到达终点,然后移到下一行。

这是一个代码(假设size(A,1)==size(M,2)):

new_A = A;                          % copy the current state
for r = 1:size(new_A,1)
        Mc = M(:,new_A(r,:)==1).';  % extract the relevat columns in new_A
        c = 1;                      % column counter
        while c<=size(A,2)
            next_item = find(all(Mc(:,c:end),1),1)+c-1; % find the next item to change
            new_A(r,next_item) = 1;             % if all rows in Mc are 1, then place 1
            Mc = M(:,new_A(r,:)==1).';          % extract the relevat columns in new_A
            c = c+1;                            % go to the next column
        end
end

导致new_A使用您上方的AM

new_A =
     1     0     0     0     1     0     0     0     0     0
     0     1     0     0     0     1     0     0     1     0
     0     0     1     0     0     0     1     0     0     1
     0     0     0     1     0     0     0     0     1     0
     1     0     0     0     0     0     0     1     0     0

这是你要找的吗?