2009-05-07 14 views
3

sagen, dass ich die folgende Grund haben if-Anweisung:Elementweise ifs in Matlab - existieren sie?

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. Matlab gibt true zurück, wenn kein Element in A 0 ist. Was ich suche, ist ein Vektorized? Art und Weise des Ausführens der if-Anweisung oben für jedes Element in A.

Eigentlich möchte ich das einfach so schnell wie möglich machen.

+0

Ich denke du meinst if (A ~ = 0) – MatlabDoug

Antwort

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

Suchen Sie nach allen Nicht-Null-Elementen? Sie können dies auf verschiedene Arten 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

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

Diese Erklärung wird y dazu führen, dass kürzer als A, wenn irgendein Element von A Null ist, was erwünscht sein kann oder nicht. –

0

Was Sie tun müssen eine bedingte anstelle von indicies verwenden, um sich die Elemente, die Sie für den Betrieb auf möchten identifizieren. Ich würde FIND verwenden. Ich speichere die Ergebnisse in VI (Valid Indicies) und verwende diese, um die Matrix zu füllen.

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... 
+1

fyi: Sie brauchen nicht zu suchen, können Sie boolesche Matrizen direkt verwenden. Der Wert von find besteht darin, bestimmte Indexwerte zu extrahieren und/oder Speicherplatz zu sparen, wenn nur ein paar Werte wahr sind. –

+0

entfernt FIND wie von JASON S angefordert – MatlabDoug

6

Vektorisierte ifs existieren nicht, aber es gibt einige Optionen. Wenn Sie alle oder alle Elemente auf true prüfen möchten, verwenden Sie die Funktion all oder any.

Hier ist ein Beispiel bedingt modifizierende 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 
+0

Ich wusste nicht b (die Boolesche Matrix) existierte, bis Sie darauf hingewiesen. Vielen Dank! – AnnaR

1

Im Allgemeinen einem Arbeitsgang 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 ist. Als ein Beispiel

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

kopiert A, aber weist -1 überall zu, dass A null ist.

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

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

+1: Cleverer Einstrich! – gnovice