我一直在寻找相当长一段时间,但我仍然没有找到一种以有效的方式计算矩阵行数的方法。有一些解决方案,但没有一个找到我的需求。上面的代码完成了这项工作,但是如果你处理一个大矩阵需要花费太多时间。我想要的输出就像变量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
答案 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);