3 votes

Comment trouver une valeur dans une matrice

0I ont sur la matrice-

A=[1 2 2 3 5 5;
   1 5 5 8 8 7;
   2 9 9 3 3 5];

A partir de la matrice, je dois compter combien d'éléments non nuls, combien de 1, combien de 2 et combien de 3 dans chaque ligne de la matrice "A" :

    [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

mais j'ai besoin de les écrire en utilisant une boucle, c'est-à-dire qu'ici j'utilise manuellement sum(A(j, :)== 1), sum(A(j, :)== 2) et sum(A(j, :)== 3) mais y a-t-il une option où je peux seulement écrire sum(A(j, :)== 1:3) et stocker toutes les valeurs dans les différentes lignes, c'est-à-dire que le résultat sera comme

b=[1 2 1;
   1 0 0;
   0 1 2];

Les experts de Matlab ont besoin de vos précieuses suggestions

8voto

Eitan T Points 24450

On dirait que vous cherchez un compte d'histogramme :

U = unique(A);
counts = histc(A', U)';
b = counts(:, ismember(U, [1 2 3]));

Exemple

%// 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));

Le résultat est :

b =
   1   2   1
   1   0   0
   0   1   2

3voto

Luis Mendo Points 32011

Généraliser les valeurs recherchées, selon les besoins du demandeur :

values = [ 1 2 3 ]; % or whichever values are sought
B = squeeze(sum(bsxfun(@(x,y) sum(x==y,2), A, shiftdim(values,-1)),2));

2voto

Dan Points 18107

Voici un moyen simple et général. Il suffit de changer n à la hauteur que vous voulez compter. n=max(A(:)) est probablement une bonne valeur générale.

 result = [];
   n = 3;
   for col= 1:n
       result = [result, sum(A==col, 2)];
   end
   result

par exemple pour 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

1voto

John Galt Points 1144

Pourquoi ne pas l'utiliser ?

B=[];
for x=1:size(A,1)
B=[B;sum(A(x,:)==1),sum(A(x,:)==2),sum(A(x,:)==3)];
end

1voto

fpe Points 2670

Je ferais comme ça :

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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X