2014-09-28 86 views
0

我想使用MATLAB來將矩陣的每一行與其每隔一行逐元素地進行比較。如果兩個條目匹配,結果將被存儲爲1,如果它們不匹配,則它將爲0.這將給出由0和1組成的對稱矩陣。在MATLAB中逐行比較

例如,令A = [4 6 7 9 5; 2 6 9 9 1]

然後,預期的結果是[1 1 1 1 1; 0 1 0 1 0; 0 1 0 1 0; 1 1 1 1 1]

我使用的代碼是(對於1000 * 1000個隨機矩陣):

A = randi(50,1000,1000); 
    B = zeros(1000000,1000); 
    D = zeros(1000000,1); 
    c=0; 
     for i=1:1000 
      for k=1:1000 
       for j=1:1000 
        if A(i,j)==A(k,j) 
         B(k+c,j)=1; 
        else 
         B(k+c,j)=0; 
        end 
       end 
      end 
      c=c+1000; 
     end 
     for l=1:1000000 
      D(l)=0; 
      for m=1:1000 
       D(l)=D(l)+(B(l,m)/(1000)); 
      end 
     end 
     E=reshape(D,1000,1000); 

這超出存儲器。任何人都可以請建議一個解決方案或更有效的代碼?

+0

在哪一行它出去的內存? – Divakar 2014-09-28 06:27:04

+2

你會意識到,如果你想檢查每一行可能的組合,你的矩陣將會有'n^2'行,其中'n'是矩陣中的行數。您擁有的列數是1000 ....因此,您的最終矩陣是'1000000 x 1000'。此外,每個「雙」是8個字節,所以你的總矩陣大小是8 GB ....所以顯然你會用盡內存。也許你應該把你的矩陣轉換成邏輯,但是這會把你的大小減小到1GB。如果您希望此代碼正常工作,您需要減小矩陣的大小。 – rayryeng 2014-09-28 06:44:44

+0

@rayryeng:你說得對。但我無法縮小矩陣的大小。有沒有其他方式可以進行比較? – 2014-09-28 07:12:58

回答

0

您可以直接嘗試逐行比較,以獲取完整的行數組並與其他行數組進行比較。

例如, 讓

A = [4 6 7 9 5; 2 6 9 9 1]; 
nA = length(A(:,1)); 
finalMat = []; 
for i = 1:nA 
    matRow = ones(nA,1)*A(i,:); % create a matrix size of A consists of same row elements 
    finalMat = [finalMat;matRow == A]; 
end 

看看它是好的,爲你的應用程序。

+1

提供的內存將能夠吞下它,你應該初始化你的'finalMat'否則Matlab將會抱怨(並且正確),以致數組在每次迭代時都會增長(=>運行速度較慢)。 – Hoki 2014-09-28 10:11:52

0

您可以使用permute到apprpriately然後bsxfun對齊尺寸的比較:

reshape(bsxfun(@eq, permute(A, [1 3 2]), permute(A, [3 1 2])), [], size(A,2)) 
+0

謝謝!這個速度更快,但是對於更大的矩陣而言,內存也不足。 – 2014-09-29 16:50:14