2 votes

Exécutez des formules en ignorant les éléments nuls

Je veux exécuter des algorithmes Matlab rapides sur des matrices en ignorant les éléments zéro.

Dans le passé, je travaillais simplement avec une double boucle très lente par exemple.

for i = 1 : size(x,1)
   for j = 1 : size(x,2)
        if x(i,j) ~= 0
            ... faire quelque chose avec x(i,j)
        end
     end
end

Mais comment puis-je effectuer l'opération matricielle sur toute la matrice x ? Par exemple, comment puis-je exécuter

x(i,j) = log(x(i,j)) if x>0 else 0    <-- code pseudo

dans Matlab sur toute la matrice sans boucles for?

Enfin, je veux réécrire des lignes comme

résultat = sum(sum((V.*log(V./(W*H))) - V + W*H));

en ignorant les zéros.

Je dois simplement comprendre le concept. Au cas où j'aurais besoin, je pourrais également utiliser NaN à la place de zéro, mais je n'ai pas trouvé par exemple la fonction

nanlog()

5voto

petrichor Points 3698

x~=0 vous renvoie les indices des emplacements non égaux à zéro. Ensuite, vous pouvez les utiliser pour indexer les emplacements correspondants de x comme suit :

>> x = [1 0 2 3; 0 4 0 5]
x =
     1     0     2     3
     0     4     0     5

>> mean(x(:)) %#moyenne de tous les éléments
ans =
    1.8750

>> mean(x(x~=0)) %#moyenne des éléments non nuls
ans =
     3

>> x(x~=0) = x(x~=0) + 1
x =
     2     0     3     4
     0     5     0     6

3voto

Rody Oldenhuis Points 24326

Vous pouvez utiliser NaN comme temporaire et profiter du fait que log(NaN) = NaN, comme ceci :

x(x==0) = NaN;
y = log(x);
y(isnan(y)) = 0;

alternativement, vous pouvez utiliser l'indexation logique :

x(x~=0) = log(x(x~=0));

ou, si vous voulez conserver x,

y = x;
y(y~=0) = log(y(y~=0));

Pour l'exemple que vous avez donné, vous pouvez simplement faire

résultat = nansum(nansum((V.*log(V./(W*H))) - V + W*H));

en supposant que V == 0 est le problème.

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