计算矩阵中的行数 - Matlab

时间:2015-11-19 23:46:27

标签: matlab vectorization

我一直在寻找相当长一段时间,但我仍然没有找到一种以有效的方式计算矩阵行数的方法。有一些解决方案,但没有一个找到我的需求。上面的代码完成了这项工作,但是如果你处理一个大矩阵需要花费太多时间。我想要的输出就像变量cont2那样,也就是说,长度等于A中的行数的向量。这是一个例子:

    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

1 个答案:

答案 0 :(得分: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);