2016-08-03 195 views
1

我有一個簡單的二次型函數。Matlab矩陣內維必須一致

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

當我只是在命令行計算二次形式,它的工作原理。

>> [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 

但是當我嘗試計算函數,我得到一個錯誤

>> 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'; 

這是爲什麼behavios出現?在我看來,這些維度按照我寫出的二次形式函數的三行的方式排列。請幫忙!

+0

你[真的不應該使用全局變量(HTTP://計算器.com/a/13006423/2627163),請參閱我的答案尋找替代方案。 – EBH

回答

1

原因是,Q不是從工作區全局可用的(並且自動被解釋爲0x0 double矩陣)。

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

將完成這項工作。

注意:下次通過使用調試器可以很容易地找到它。

+0

謝謝!我如何在函數內部提供特定的Q矩陣?我不想輸入它作爲函數輸入,因爲後來我想在函數上使用Fmincon,並且我想在所有矢量上運行fmincon,保持Q不變。 – Amatya

+0

好吧。我輸入Q作爲quadobj函數[y,grady] = quadobj(x,Q)的輸入,並在fmincon中寫入quadobj作爲匿名函數。 fmincon(@(x)quadobj(x,Q),x0,[],[],[],[],[],[],... @ confuneq2,options) – Amatya

+0

我正在使用調試器,沒有告訴我Q是0x0。我將在未來仔細審查。謝謝 – Amatya

1

不要使用global Q,而不是把它作爲一個常量您的匿名函數:

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

,然後調用fmincon(qo,x0,[]...)