如果x
是一个多维矩阵,优化函数lsqnonlin似乎会改变x
的形状,函数的参数被最小化。为什么这样做我可以阻止吗?
documentation表示"当x0是矩阵时,求解器将x作为与x0相同大小的矩阵传递给...目标函数。"但是,在以下示例中,x的大小在lsqnonlin的后续迭代中发生更改。
最小化的功能:
function y = myfun(X)
size(X)
y = [];
for k = 1:numel(X)
y(k) = 2 * X(k) + 5;
end
end
致电lsqnonlin:
x0 = rand(2,2,3);
x = lsqnonlin(@myfun,x0);
显示器:
ans =
2 2 3
ans =
2 6
等。
为什么X的形状会发生变化?
答案 0 :(得分:0)
修改强>: 这个错误已在MATLAB R2015b中修复。
通过查看堆栈跟踪,当X
调用目标函数时,似乎优化变量finDiffEvalAndChkErr
的维度变为错误,而finitedifferences
则调用该函数。这些都是加密函数,所以没什么好说的。唯一要做的就是注意Mathworks。
函数finitedifferences
以这种方式运行,因为当sfdnls
调用它时,它接收列数组形状的X
,并且它的真实大小为行数和列数,后者是X
的最后一个维度的乘积。
我想X
内的reshape
可以恢复myfun
的尺寸。另一种可能性是给lsqnonlin
目标函数的梯度,以便不再使用明显错误的内部函数。