2015-11-19 44 views
3

我一直在尋找相當長的一段時間,但我仍然沒有找到一種有效地計算矩陣行的方法。這裏有一些解決方案,但沒有一個能夠找到我的需求。上面的代碼可以完成這項工作,但如果您處理大型矩陣需要太多時間。我想有輸出是一個就像變量CONT2,即,長度等於在A.這裏的行數的矢量是一個例子:計算一個矩陣中的行數 - Matlab

A = [ 1 2 3 ; 4 3 5; 1 2 3; 1 2 3; 4 3 5; 5 2 1; 3 2 1; 3 5 1]; 

    [rows,~] = size(A); 
    cont2 = zeros(rows,1,'single'); 

    for i = 1:rows 
     cont = 0; 
     for j = 1:rows 

      if A(i,:) == A(j,:) 
       cont = cont + 1; 
      end 

      cont2(i) = cont; 
     end 
    end 

%結果: CONT2 =

 3 
    2 
    3 
    3 
    2 
    1 
    1 
    1 

回答

4

如何有關bsxfun

result = sum(all(bsxfun(@eq, A, permute(A, [3 2 1])), 2), 3); 

這將每一行相互比較,並將匹配次數相加以產生所需的結果。


同樣地,你可以每行減少使用unique唯一的整數標籤,然後比較這些標籤:

[~, ~, u] = unique(A, 'rows'); 
result = sum(bsxfun(@eq, u, u.'), 2); 

或者使用histc來統計每個標籤出現了多少次:

[~, ~, u] = unique(A, 'rows'); 
c = histc(u, 1:max(u)); 
result = c(u);