Frage

Sagen, ich habe die folgenden grundlegenden if-Anweisung:

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

Das Problem ist, dass A nicht eine einfache Zahl, sondern ein Vektor ist. Matlab gibt true zurück, wenn kein Element in A ist 0. Was ich suche ein vektorisiert ist? Art und Weise der perforimg die if-Anweisung oben für jedes Element in A

Eigentlich möchte ich einfach wie möglich, dies so schnell tun.

War es hilfreich?

Lösung

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

Andere Tipps

Vectorized ifs nicht existieren, aber es gibt einige Optionen. Wenn Sie gilt für alle oder irgendwelche Elemente testen möchten, verwenden Sie die alle oder eine beliebige Funktion.

Hier ist ein Beispiel bedingt Modifizieren Werte einer Matrix:

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 der Regel eine Operation auf einige Elemente einer Matrix und eine andere Operation an den übrigen Elementen durchzuführen, eine einzeilige Lösung:

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

wobei B eine logische Matrix. Als Beispiel

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

Kopien A, jedoch weist -1 überall, dass A gleich Null ist.

Da jedoch die Frage beschäftigt sich mit Unendlichkeit oder NaNs, kann es noch kurz und bündig getan werden:

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

Suchen Sie für alle Nicht-Null-Elemente? Sie können dies ein paar Möglichkeiten tun.

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

oder für einen Einzeiler, können Sie eine bedingte anstelle von indicies verwenden

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

Was Sie tun müssen, ist, die Elemente identifizieren Sie bedienen möchten. Ich würde FIND verwenden. Ich speichere die Ergebnisse in VI (Gültig indicies) und verwenden, die die Matrix besiedeln.

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...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top