Matlab 如何通过引用矩阵中的坐标执行逻辑“与”运算
矩阵Matlab 如何通过引用矩阵中的坐标执行逻辑“与”运算,matlab,matrix,logical-operators,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
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)
第二步:
在主M
矩阵中扫描此坐标并执行和操作。如果答案为1,则将1放置在A
矩阵的相应坐标中。例如,M
矩阵中的(1,1)(1,5)
与(2,1)(2,5)=>1和0=>0进行AND运算。同样地,在M
矩阵中(3,1)(3,5)
到(10,1)(10,5)
。如果出现任何位置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
的每一行r
,你要提取M
列,其中A(r,:)==1
,然后将1
放在A(r,:)
的第一列c
中,提取的M
中的行c
中的所有列都是1。使用更新的A
在同一行上继续此过程,直到到达末尾,然后移动到下一行
下面是一个代码(假设大小(a,1)=大小(M,2)
):
这就是你想要的吗?我完全不清楚你想做什么。如何选择矩阵之间的比较?当一个矩阵比另一个大时会发生什么?实际上从矩阵中提取1的位置坐标。扫描M矩阵中的特定坐标,然后使用该坐标执行和操作。对于eg,在矩阵中取第一行,1的位置是1和5。现在,仅在M矩阵1和第5列中执行。即(1,1)(1,5)和(2,1)(2,5)。如果ans为1,则表示在第一行中取1,表示矩阵(1,2)(1,5)的位置。然后用(1,1)(1,5)和(3,1)(3,5)进行检查如果ans为0,则不进行标记。此矩阵大小无关紧要,因为此操作最多只会运行(大小(A))次,这在上述给定矩阵中是5次。M矩阵用于检查我们选择的特定列1’s与矩阵的空间。如果满足,则将1放置在特定行中,该行放置它满足M。是,你是对的,但有一个问题。它必须在每次处理后更新矩阵。例如,当在矩阵中取第四行时,1的位置在(4,4)中。它必须使用(1,4)进行处理。。(10,4)在M矩阵中。其中(9,4)满足条件。所以1被放置在矩阵的(4,9)中。更新后的A矩阵在第4行有两个1,即(4,4)(4,9)。现在这个过程已经满足了(4,4)(4,9)和(1,4)(1,9),…(10,4)(10,9)。现在所有这些地方都不符合条件。Soo,在new_A中没有第(4,10)位的1。因此,您想在行级别重复此操作,即在继续下一行之前,反复更新A
中的同一行吗?或者你想检查一下所有矩阵,完成后再重新开始?最重要的是,这个过程应该在什么时候停止?这个过程应该通过逐行检查矩阵来结束,因为没有其他的可能性来拟合1。对于eg,在矩阵中将第4行更新为(4,4)(4,9)后,将使用M矩阵进行检查,是否有可能拟合1。如果不满足要求,则第4行的流程结束。同样,对于第5行,则停止。对于矩阵中的前3行,它不满足于第一次检查本身,因此过程逐行结束。在某些情况下,随着矩阵大小的增加,A可能会更新多次。在一般情况下,它必须检查是否有可能将1与更新的矩阵相匹配。如果不继续到下一行停止迭代。我想我完全失去了你。。。我已经对答案做了另一次编辑,这是我最后一次尝试,这次在行上循环,直到没有进一步的更改,尽管我不确定这是否有任何区别。我希望这能解决问题。
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
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 =
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