0

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

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

Y1Y2两个观察值。F1F2是非线性函数,可导,但形式复杂。x1并且x2是两个未知数。

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

4

2 回答 2

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 来放大该区域,直到达到足够的精度。

于 2013-09-18T12:59:42.810 回答
1

跟进@DennisJaheruddin 的回答,在某些情况下,网格搜索的计算成本低于使用单纯形法最小化目标函数的成本,如果评估函数F1,F2比执行计算目标的算术成本高得多,即使对于小图像也会发生函数(用于F1, F2预先计算)

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

然后为每个点找到

Imin = min((Y1 - F1).^2 + (Y2 - F2).^2)

看起来这可以被矢量化。解决方案Imin索引到原始网格,因此您可以计算出每个像素的 X1min 和 X2min。

于 2013-09-18T14:40:43.337 回答