2016-08-03 157 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,[]...)