我有一个 3D 图像V
。对于这个 3D 图像中的每个像素v
,我需要最小化一个函数
(Y1 - F1(x1, x2))^2 + (Y2 - F2(x1, x2))^2
Y1
是Y2
两个观察值。F1
和F2
是非线性函数,可导,但形式复杂。x1
并且x2
是两个未知数。
我知道如何使用或在 matlab 中逐个像素地解决这个问题。但这太慢了。任何人都可以告诉我如何在整个图像中解决这个问题?先感谢您。lsqnonlin
lsqcurvefit
我有一个 3D 图像V
。对于这个 3D 图像中的每个像素v
,我需要最小化一个函数
(Y1 - F1(x1, x2))^2 + (Y2 - F2(x1, x2))^2
Y1
是Y2
两个观察值。F1
和F2
是非线性函数,可导,但形式复杂。x1
并且x2
是两个未知数。
我知道如何使用或在 matlab 中逐个像素地解决这个问题。但这太慢了。任何人都可以告诉我如何在整个图像中解决这个问题?先感谢您。lsqnonlin
lsqcurvefit
首先,我认为你应该尝试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 来放大该区域,直到达到足够的精度。
跟进@DennisJaheruddin 的回答,在某些情况下,网格搜索的计算成本低于使用单纯形法最小化目标函数的成本,如果评估函数F1,F2
比执行计算目标的算术成本高得多,即使对于小图像也会发生函数(用于F1, F2
预先计算)
我将首先了解解决方案范围和解决方案值所需的精度,然后按照@DennisJaheruddin 的建议计算vec1
和vec2
作为跨越范围的向量,并预先计算F1(x1, x2)
和F2(x1, x2)
然后为每个点找到
Imin = min((Y1 - F1).^2 + (Y2 - F2).^2)
看起来这可以被矢量化。解决方案Imin
索引到原始网格,因此您可以计算出每个像素的 X1min 和 X2min。