Domanda

Dire che ho la seguente if-statement di base:

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

Il problema è che A non è un numero semplice ma un vettore. Matlab restituisce vero se nessun elemento in A è 0. Quello che sto cercando è un vettore? modo di perforare l'istruzione if sopra per ciascun elemento in A.

In realtà, voglio semplicemente farlo il più velocemente possibile.

È stato utile?

Soluzione

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

Altri suggerimenti

I se vettoriali non esistono, ma ci sono alcune opzioni. Se si desidera verificare che tutti o tutti gli elementi siano veri, utilizzare la funzione all o any.

Ecco un esempio di modifica condizionale dei valori di una 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

In generale, per eseguire un'operazione su alcuni elementi di una matrice e un'altra operazione sugli elementi rimanenti, una soluzione a una riga è:

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

dove B è una matrice logica. Ad esempio,

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

copia A ma assegna -1 ovunque che A sia zero.

Tuttavia, poiché la domanda riguarda infinito o NaN, può essere fatta in modo ancora più conciso:

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

Stai cercando tutti gli elementi diversi da zero? Puoi farlo in un paio di modi.

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

O per un one-liner, puoi usare un condizionale al posto delle indicazioni

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

Quello che devi fare è identificare gli elementi su cui vuoi operare. Vorrei usare FIND. Conservo i risultati in VI (Indici validi) e li utilizzo per popolare 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...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top