如何在matlab中最小化非线性函数进行批处理

时间:2013-09-18 11:03:54

标签: matlab minimization

我有一张3D图片V。对于此3D图像中的每个像素v,我需要最小化函数

(Y1 - F1(x1, x2))^2 + (Y2 - F2(x1, x2))^2

Y1Y2是两个观察结果。 F1F2是非线性函数,可以派生,但形式复杂。 x1x2是两个未知数。

我知道如何在matlab中使用lsqnonlinlsqcurvefit来解决逐像素这个问题。但它太慢了。任何人都可以告诉我如何在整个图像中解决这个问题?提前谢谢。

2 个答案:

答案 0 :(得分:2)

首先,我认为你应该尝试fminsearch。它专为此类问题而设计。

如果fminsearch无法帮助您,但您知道它们的行为方式,您可以尝试使用手动定量方法(只需在很多点计算它并查看它是否表现良好)。

如果你的函数可以处理矢量化输入,可以这样做:

vec1 = 0:0.1:10; %Assume you expect it somewhere between 0 and 10
vec2 = 0:0.1:10;
[x1, x2] = ndgrid(vec1, vec2); 
result = (Y1 - F1(x1, x2))^2 + (Y2 - F2(x1, x2))^2

如果这不起作用,您可以这样做:

horzcount = 0;
for x1 = vec1
   horzcount = horzcount +1;
   vertcount = 0;
   for x2 = vec2
      vertcount = vertcount + 1;
      result(horzcount, vertcount) = (Y1 - F1(x1, x2))^2 + (Y2 - F2(x1, x2))^2;
   end
end

然后查看结果(在区域上使用surf或在行或列上使用plot)并确定您是否满意找到包含最佳区域的区域。 然后通过相应地调整vec1和vec2放大该区域,直到达到足够的精度。

答案 1 :(得分:1)

跟随@ DennisJaheruddin的回答,有一点是网格搜索的计算成本低于使用单纯形的目标函数的最小化,并且如果评估函数F1,F2成本更高,即使对于小图像也是如此而不是执行算术来计算目标函数(对于F1, F2预先计算的)

我首先会了解解决方案范围和解决方案值所需的精度,然后按照@DennisJaheruddin的建议计算vec1vec2,作为跨越范围的向量,并预计算{{ 1}}和F1(x1, x2)

然后为每个点找到

F2(x1, x2)

看起来这可以进行矢量化。解Imin = min((Y1 - F1).^2 + (Y2 - F2).^2) 索引到原始网格中,因此您可以在每个像素处找出X1min和X2min。