2017-10-30 1 views
0

Ich bekomme einen Fehler für undefinierte Funktion oder Variable in der if-Anweisung (letzte Zeile vor dem letzten Ende), wenn ich die Gleichheiten bereits zugewiesen habe.Warum bekomme ich undefinierte Variable in einer if-Anweisung?

l_min = nan(372,1); 
A = randn(372,3); 
B= randn(372,3); 
for t=1:372 
    min_ct = min(A(t,:)); 
     if min_ct == A(t,1); 
     l = B(t,1); 
     if min_ct == A(t,2); 
      l = B(t,2); 
     elseif min_ct == A(t,3); 
      l = B(t,3); 
     end 
    end 
    l_min(t) = l; 
end 

Konnte jemand mit diesem helfen?

+0

Sie definieren nicht 'L' überall, wenn Ihre erste logische Aussage falsch ist (' wenn min_ct A (t == 1) '), so 'l_min (t) = l;' kann nicht ausgewertet werden. In Zukunft ist es viel hilfreicher, wenn Sie die Fehlermeldung * actual * angeben und nicht die Paraphrasierung, da sie die genaue Zeile angibt, in der sich das Problem befindet. – excaza

+0

Es ist unmöglich, eines der Kriterien nicht zu erfüllen, da der Mindestwert von A (1, :) zum Beispiel einigen der Elemente von A (1, :) entsprechen muss !! Alles, was ich bekommen möchte, ist die Position des Minimalwerts für jede Iteration von t. Zum Beispiel, wenn A (1, :) = [5 3 2], ist der minimale Wert offensichtlich, dass es 2 ist, was das dritte Element ist. Ich möchte, dass der Code das dritte Element eines Vektors B (1, :) an der ersten Position des Vektors l_min anordnet. – user7137145

+2

Ich stelle mir vor, das zweite "wenn" soll eigentlich ein "Anderes" sein und eines der "Enden" ist entfernt. –

Antwort

0

Sie können Ihre Aufgabe auch ohne die for-Schleife mit Vektorisierung durchführen.

Dies wird durch den Index Ausgabe von der min Funktion und angeben, welche Richtung Sie in die Minima bestimmen wollen getan einfach alles in und nach mit for-Schleife ersetzen.

[~, ind] = min(A,[],2); % Determine minimum locations 
bindex = sub2ind(size(B),1:size(B,1),ind') % Convert the subscripts to indices 
l_min = B(bindex)'; 
1

Ihre if Logik ist fehlerhaft und stattdessen

min_ct = min(A(t,:)); 
if min_ct == A(t,1); 
    l = B(t,1); 
elseif min_ct == A(t,2); % <-- Note thise is an *else*if 
    l = B(t,2); 
elseif min_ct == A(t,3); 
    l = B(t,3); 
end 

Ihr seltsamer Halb Einzug wahrscheinlich den Fluss Ihrer Logik zu verwirren gehandelt werden soll.


Hinweis: Die Verwendung == auf Doppel neigt man unexpected results als auch geben, damit Sie eine bessere Methode für die Verwendung dieser ohnehin in Betracht ziehen sollten. Insbesondere ist der zweite Ausgang der min Funktion genau das, was Sie wollen!

Ersetzen Sie Ihre if Leiter mit den folgenden:

for t=1:372 
    [~, min_idx] = min(A(t,:)); 
    l_min(t) = B(t, min_idx); 
end 
Verwandte Themen