2015-11-19 65 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);