Question

Disons que j'ai l'instruction if suivante:

if (A ~= 0)
   % do something like divide your favorite number by A
else
   % do something like return NaN or infinity
end

Le problème est que A n’est pas un simple nombre mais un vecteur. Matlab renvoie true si aucun élément de A n’a pour valeur 0. Ce que je recherche, c’est une vectorisée? manière de perforimg la déclaration if ci-dessus pour chaque élément de A.

En fait, je veux simplement le faire aussi vite que possible.

Était-ce utile?

La solution

B = zeros(size(A));
B(A~=0) = FAV./A(A~=0);  
B(A==0) = NaN;

Autres conseils

Les ifs vectorisés n'existent pas, mais il existe quelques options. Si vous voulez tester tous les éléments ou tous les éléments vrais, utilisez la fonction tout ou n’importe laquelle.

Voici un exemple de modification conditionnelle des valeurs d'une matrice:

b = A ~= 0;      % b is a boolean matrix pointing to nonzero indices
                 % (b could be derived from some other condition,
                 %  like b = sin(A)>0
A(b) = f(A(b))   % do something with the indices that pass
A(~b) = g(A(~b)) % do something else with the indices that fail

En général, pour effectuer une opération sur certains éléments d'une matrice et une autre sur les éléments restants, une solution sur une ligne est la suivante:

Z = B .* X + ~B .* Y;

où B est une matrice logique. Par exemple,

Z = (A == 0) .* -1 + (A ~= 0) .* A;

copie A mais affecte -1 partout où A vaut zéro.

Cependant, comme la question concerne l'infini ou les NaN, vous pouvez le faire de manière encore plus succincte:

Z = FAV ./ A; % produces inf where A == 0
Z = (A ~= 0) .* FAV ./ A; % produces NaN where A == 0

Recherchez-vous tous les éléments non nuls? Vous pouvez le faire de plusieurs manières.

nonzero = find(A); % returns indicies to all non-zero elements of A
y = x./A(nonzero); % divides x by all non-zero elements of A
                   % y will be the same size as nonzero

Ou pour un one-liner, vous pouvez utiliser un conditionnel au lieu d'indices

y = x./A(A~=0); % divides x by all non-zero elements of A

Ce que vous devez faire est d’identifier les éléments sur lesquels vous souhaitez agir. Je voudrais utiliser FIND. Je stocke les résultats dans VI (Indicateurs valides) et l’utilise pour remplir la matrice.

clear
clc

den = [2 0 2; 0 2 0; -2 -2 -2]
num = ones(size(den));
frac = nan(size(den));

vi = (den ~=0)

frac(vi) = num(vi)./den(vi)

vi = (den == 0)

frac(vi) = nan %just for good measure...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top