为什么lsqnonlin重塑其输入参数?

时间:2014-09-09 00:12:46

标签: matlab

如果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的形状会发生变化?

1 个答案:

答案 0 :(得分:0)

修改: 这个错误已在MATLAB R2015b中修复。


通过查看堆栈跟踪,当X调用目标函数时,似乎优化变量finDiffEvalAndChkErr的维度变为错误,而finitedifferences则调用该函数。这些都是加密函数,所以没什么好说的。唯一要做的就是注意Mathworks。

函数finitedifferences以这种方式运行,因为当sfdnls调用它时,它接收列数组形状的X,并且它的真实大小为行数和列数,后者是X的最后一个维度的乘积。

我想X内的reshape可以恢复myfun的尺寸。另一种可能性是给lsqnonlin目标函数的梯度,以便不再使用明显错误的内部函数。