我有一个简单的二次形式函数。
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';
为什么会出现这种行为?在我看来,尺寸按照我写的二次形式函数的第三行的方式排列。请帮忙!
答案 0 :(得分:1)
原因是,Q
不是全局可用的工作空间(而是自动解释为0x0 double
矩阵)。
global Q;
Q = rand(3);
quadobj([1,1,1])
将完成这项工作。
注意:下次您可以使用调试器轻松找到它。
答案 1 :(得分:1)
不要使用global Q
,而是将其作为常量传递给您的匿名函数:
Q = rand(3);
qo = @(x) quadobj(x,Q)
然后拨打fmincon(qo,x0,[]...)