【问题标题】:How to perform logical AND operation by refering the coordinates in matrix [closed]如何通过引用矩阵中的坐标来执行逻辑与运算[关闭]
【发布时间】:2016-07-27 17:10:19
【问题描述】:

矩阵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 矩阵的相应坐标中。例如,M 矩阵中的(1,1) (1,5)(2,1)(2,5)==> 1 1 ANDed 0 0 ==>0 0 进行与运算。同样(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 in (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

【问题讨论】:

  • 我完全不清楚你想做什么。您如何选择要在矩阵之间进行比较的内容?当其中一个矩阵比另一个大时会发生什么?
  • 实际上是从A矩阵中拾取1的位置坐标。扫描 M 矩阵中的特定坐标,然后对其执行 AND 操作。例如,在 A 矩阵中取第一行,1 的位置是 1 和 5。现在 AND 仅在 M 矩阵 1 和第 5 列中执行。即 (1,1)(1,5)AND(2,1)(2 ,5) 如果 ans 为 1 1 表示将 1 放置在第一行 A 矩阵 (1,2) (1,5) 位置 A 矩阵。然后用 (1,1)(1,5)AND(3, 1)(3,5) 如果 ans 为 0,则保持不变。
  • 此矩阵大小无关紧要,因为此操作将运行最多 (size(A)) 次,仅是上述矩阵中的 5 次。M 矩阵用于检查特定列我们用 A 矩阵选择了 1 的位置。如果满意,将 1 放在特定的行中,它对 M 感到满意。

标签: matlab matrix logical-operators


【解决方案1】:

如果我理解您的问题,那么对于A 的每一行r,您要提取A(r,:)==1 所在的所有M 列,然后将1 放在A(r,:) 的第一列c 中提取的Mc 行中的所有列都是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

这是你要找的吗?

【讨论】:

  • 是的,你是对的。但是有一个问题。它必须在处理后每次更新 A 矩阵。例如,在 A 矩阵中的第 4 行中,1 的位置在 (4,4) 中。它必须在 M 矩阵中处理​​ (1,4) .. (10,4)。那里 (9,4) 满足了条件。所以 1 放在 A 矩阵的 (4,9) 中。更新后的 A 矩阵在第 4 行有两个 1,即 (4,4) (4,9)。现在该过程满足 (4,4) (4,9) AND (1,4) (1,9),...(10,4)(10,9)。现在这些地方都不满足条件了。 Soo,在 new_A 中,第 (4,10) 位没有 1。
  • 所以您想在行级别重复此操作,即在继续下一行之前一次又一次地更新 A 中的同一行?或者你想遍历所有矩阵一次,完成后重新开始? 最重要的 - 这个过程应该在什么时候停止?
  • 该过程应该通过逐行检查 A 矩阵来结束,没有其他可能适合 1。例如,在将 A 矩阵中的第 4 行更新为 (4,4) (4,9) 之后,用 M 矩阵进行检查,是否有可能拟合 1。如果不满足,则第 4 行的过程结束。第 5 行类似,然后停止。
  • 对于 A 矩阵中的前 3 行,第一次检查自身不满足,因此该过程逐行结束。在某些情况下,A 可能会随着矩阵大小的增加而更新多次。一般来说,它必须检查是否有可能将 1 与更新的 A 矩阵相匹配。如果不继续下一行,则停止迭代。
  • 我想我完全失去了你......我已经对答案进行了另一次编辑,我最后一次尝试,这次循环遍历行直到没有进一步的变化,虽然我不确定有什么不同。我希望这能解决问题。
猜你喜欢
  • 2017-12-06
  • 1970-01-01
  • 2012-01-02
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
相关资源
最近更新 更多