0我有矩阵 -
A=[1 2 2 3 5 5;
1 5 5 8 8 7;
2 9 9 3 3 5];
从矩阵我需要计算许多非零元素,如何给定矩阵“A”中的任何1,多少2和多少3。对于这些我编写了一个代码如下:
[Ar Ac]=size(A);
for j=1:Ar
for k=1:Ac
count(:,j)=nnz(A(j,:));
d(:,j)=sum(A(j,:)== 1);
e(:,j)=sum(A(j,:)==2);
f(:,j)=sum(A(j,:)==3);
end
end
但我需要在循环中写这些,即在这里我手动使用sum(A(j,:))= 1),sum(A(j,:))== 2)和sum(A(j,: )== 3)但是有任何选项,我只能写和(A(j,:))= 1:3)并将所有值存储在不同的行中,即结果将像 -
b=[1 2 1;
1 0 0;
0 1 2];
Matlab专家需要您宝贵的建议
答案 0 :(得分:8)
听起来你正在寻找直方图计数:
U = unique(A);
counts = histc(A', U)';
b = counts(:, ismember(U, [1 2 3]));
%// Input matrix and vector of values to count
A = [1 2 2 3 5 5; 1 5 5 8 8 7; 2 9 9 3 3 5];
vals = [1 2 3];
%// Count values
U = unique(A);
counts = histc(A', U)';
b = counts(:, ismember(U, vals));
结果是:
b =
1 2 1
1 0 0
0 1 2
答案 1 :(得分:3)
根据提问者的要求概括所寻求的价值观:
values = [ 1 2 3 ]; % or whichever values are sought
B = squeeze(sum(bsxfun(@(x,y) sum(x==y,2), A, shiftdim(values,-1)),2));
答案 2 :(得分:2)
这是一种简单而通用的方法。只需将n
更改为您想要的数量。 n=max(A(:))
可能是一个很好的一般价值。
result = [];
n = 3;
for col= 1:n
result = [result, sum(A==col, 2)];
end
result
e.g。 n
= 10
result =
1 2 1 0 2 0 0 0 0 0
1 0 0 0 2 0 1 2 0 0
0 1 2 0 1 0 0 0 2 0
答案 3 :(得分:1)
为什么不使用它?
B=[];
for x=1:size(A,1)
B=[B;sum(A(x,:)==1),sum(A(x,:)==2),sum(A(x,:)==3)];
end
答案 4 :(得分:1)
我会这样做:
B = [arrayfun(@(i) find(A(i,:) == 1) , 1:3 , 'UniformOutput', false)',arrayfun(@(i) find(A(i,:) == 2) , 1:3 , 'UniformOutput', false)',arrayfun(@(i) find(A(i,:) == 3) , 1:3 , 'UniformOutput', false)'];
res = cellfun(@numel, B);
答案 5 :(得分:0)
这是一个紧凑的:
sum(bsxfun(@eq, permute(A, [1 3 2]), 1:3),3)
您可以将1:3
替换为任何数组。
你可以为它创建一个匿名函数
rowcnt = @(M, R) sum(bsxfun(@eq, permute(M, [1 3 2]), R),3);
然后在数据上运行
>> rowcnt(A,1:3)
ans =
1 2 1
1 0 0
0 1 2
以及更一般化的案例
>> rowcnt(A,[1 2 5 8])
ans =
1 2 2 0
1 0 2 2
0 1 1 0