如何从矩阵中找到一个值

时间:2013-08-14 10:31:51

标签: matlab

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专家需要您宝贵的建议

6 个答案:

答案 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