我有一个三维维度数组(行x列x 8(。对于前两个维度中的每个元素,我在第三个维度上有8个值,我必须将其拟合到一个方程中,如指数、多项式等。我已经为这个函数编写了代码,目前我正在通过在前两个维上循环来产生我的输出,如下所示:
for i=1:rows
for j=1:cols
outputArray(i,j) = functionHandle(inputArray(i,j,1:8));
end
end
我可以以某种方式使用bsxfun、arrayfun或其他矢量化方法来消除for循环,以便使用类似的方法生成输出吗?
outputArray = bsxfun(@functionHandle,inputArray)
添加功能Handle
function output = functionHandle(xData,yData)
ft = fittype( 'a*exp(-b*x)+c','independent', 'x','dependent','y' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Algorithm = 'Trust-Region';
opts.Display = 'Off';
opts.MaxFunEvals = 100;
opts.MaxIter = 100;
opts.Robust = 'LAR';
opts.Lower = [-Inf 0 -Inf];
opts.StartPoint = [0.35 0.05 0.90];
% Fit model to data.
[FitResult,~] = fit(xData,yData,ft,opts);
output = FitResult.a;
end
答案完全取决于函数是否矢量化。您应该编写该函数,使其允许R
×C
×8
输入并产生R
×C
×N
输出,其中N
是拟合参数的数量。
也就是说,矢量化必须在函数内进行;不能在外面做。从外部来看,您只能在循环中使用该函数。请注意,arrayfun
与for
循环类似,并且具有相当的性能。
由于您的函数基本上使用fit
,因此似乎无法向量化,因为fit
一次只接受一组输入,并产生相应的输出。