我有一张3D图片V
。对于此3D图像中的每个像素v
,我需要最小化函数
(Y1 - F1(x1, x2))^2 + (Y2 - F2(x1, x2))^2
Y1
和Y2
是两个观察结果。 F1
和F2
是非线性函数,可以派生,但形式复杂。 x1
和x2
是两个未知数。
我知道如何在matlab中使用lsqnonlin
或lsqcurvefit
来解决逐像素这个问题。但它太慢了。任何人都可以告诉我如何在整个图像中解决这个问题?提前谢谢。
答案 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的建议计算vec1
和vec2
,作为跨越范围的向量,并预计算{{ 1}}和F1(x1, x2)
然后为每个点找到
F2(x1, x2)
看起来这可以进行矢量化。解Imin = min((Y1 - F1).^2 + (Y2 - F2).^2)
索引到原始网格中,因此您可以在每个像素处找出X1min和X2min。