2016-08-03 22 views
1

Ich habe eine einfache quadratische Form-Funktion.Matlab Matrix innere Dimension muss übereinstimmen

function [y, grady] = quadobj(x) 
global Q 
y = x*Q*x'; 
if nargout > 1 
    grady = 2*Q*x; 
end 

Wenn ich einfach die quadratische Form in der Befehlszeile berechnen, funktioniert es.

>> [1 1 1]*Q*[1 1 1]' 

ans = 

    -2.5977 


>> Q 

Q = 

    -1.0000 -0.0731 0.3043 
    -0.0731 -1.0000 -0.0300 
    0.3043 -0.0300 -1.0000 

Aber wenn ich versuche, um die Funktion zu bewerten, erhalte ich einen Fehler

>> quadobj([1 1 1]) 
Error using * 
Inner matrix dimensions must agree. 

Error in quadobj (line 3) 
y = x*Q*x'; 

3 y = x*Q*x'; 

Warum ist das behavios auftritt? Es scheint mir, dass die Dimensionen so ausgerichtet sind, wie ich Zeile drei der quadratischen Formfunktion geschrieben habe. Bitte helfen Sie!

+0

Sie [sollte wirklich nicht Globals verwenden] (http: // Stackoverflow .com/a/13006423/2627163), sehe meine Antwort für eine Alternative. – EBH

Antwort

1

Der Grund dafür ist, dass Q nicht global vom Arbeitsbereich verfügbar ist (und stattdessen automatisch als 0x0 double Matrix interpretiert wird).

global Q; 
Q = rand(3); 
quadobj([1,1,1]) 

wird den Job erledigen.

Hinweis: Das nächste Mal können Sie das mit dem Debugger leicht finden.

+0

Danke! Wie kann ich eine spezifische Q-Matrix innerhalb der Funktion verfügbar machen? Ich möchte es nicht als Funktionseingabe eingeben, weil ich später Fmincon für die Funktion verwenden möchte und fmincon über alle Vektoren laufen lassen möchte, wobei Q konstant bleiben soll. – Amatya

+0

Ok, hab es. Ich habe Q als Eingabe in die Quadobj-Funktion [y, grady] = quadobj (x, Q) eingegeben und quadobj als anonyme Funktion in fmincon geschrieben. fmincon (@ (x) quadobj (x, Q), x0, [], [], [], [], [], [], ... @ confuneq2, Optionen) – Amatya

+0

Ich benutzte den Debugger aber irgendwie zeigte mir nicht, dass Q 0x0 war. Ich werde in Zukunft genauer hinsehen. Vielen Dank – Amatya

1

nicht global Q Verwenden Sie stattdessen es als Konstante auf Ihre anonyme Funktion übergeben:

Q = rand(3); 
qo = @(x) quadobj(x,Q) 

und rufen dann fmincon(qo,x0,[]...)