2016-07-27 57 views
-3

矩陣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: 掃描這個座標主M矩陣並進行AND運算。如果答案是1,則將1放置在相應的座標A矩陣中。例如,(1,1) (1,5)中的M矩陣與(2,1)(2,5)==> 1 1 ANDed 0 0 ==>0 0進行了與運算。同樣(3,1) (3,5)高達(10,1) (10,5)M矩陣。如果有任何地方出現了1則在A矩陣的相應座標處放置1。

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 

在這裏,在在第四行A矩陣給定的矩陣中(4,4)具有1檢查剩餘座標M矩陣。它與(1,4)(2,4)進行AND運算,而(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 
+3

我完全不清楚你想做什麼。你如何選擇矩陣之間的比較?當其中一個矩陣大於另一個時會發生什麼? – EBH

+0

實際上從A矩陣中拾取1的位置座標。掃描M矩陣中的特定座標,然後執行AND操作。例如,在A矩陣中的第1行,1的位置是1和5.現在僅在M矩陣1和第5列中執行AND.ie(1,1)(1,5)AND(2,1)(2 ,5)如果ans爲1 1表示將第1行第1行放入A矩陣的第(1,2)(1,5)處。然後用(1,1)(1,5)AND(3, 1)(3,5)如果ans是0則不變。 – SIVAKUMAR

+0

這個矩陣的大小並不重要,因爲這個操作在上面給出的矩陣中將達到(size(A))倍,只有它的5倍.M矩陣用於檢查我們選擇1的位置的特定列矩陣。如果滿意的地方放置了滿足M的特定行。 – SIVAKUMAR

回答

0

如果我明白你的問題,然後針對每行的Ar要提取所有M列,其中A(r,:)==1,然後將1在第一列cA(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_AAM以上:

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 

這是你看什麼呢?

+0

是的,你是正確的。但是有一個問題。每次處理後都必須更新A矩陣。例如,當在矩陣1中的第4行位於(4,4)中時。它必須用M矩陣中的(1,4)...(10,4)進行處理。有(9,4)滿足條件。所以1放置在(4,9)A矩陣中。更新後的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位。 – SIVAKUMAR

+0

所以你想在行級別重複這一點,即在繼續下一行之前一次又一次更新'A'中的同一行?或者你想要遍歷所有矩陣一次,並在完成重新開始之後?和**最重要的** - 這個過程何時應該停止? – EBH

+0

該過程應該通過逐行檢查A矩陣結束,沒有其他可能性適合1。例如,在A矩陣中將第4行更新爲(4,4)(4,9)後,用M矩陣進行檢查,是否有可能適合1.如果不滿足第4行的處理結束。第五排同樣停下來。 – SIVAKUMAR