我需要在parfor
循环内绘制带有子图的图形,类似于this question(后者处理图形的质量)。
我的代码如下:
parfor idx=1:numel(A)
N = A(idx);
fig = figure();
ax = subplot(3,1,1);
plot(ax, ...);
...
saveas(fig,"..."),'fig');
saveas(fig,"...",'png');
end
这给出了一个奇怪的错误:
数据必须为数字,日期时间,持续时间或可转换为双精度的数组。
我确定问题不在于非数值数据,因为没有并行工作的相同代码。
在这一点上,我预计会出现错误,因为线程将同时创建和访问图形对象和轴对象,并且我认为不能确保句柄始终与正确的对象相对应(可以说线程是“交叉绘图”)。 / p>
如果我预先初始化对象,然后像这样访问它们,
ax = cell(1,numel(A)); % or ax = zeros(1,numel(A));
ax(idx) = subplot(3,1,1);
在我使用的拟合调用中,我什至出现了更奇怪的错误:
Error using curvefit.ensureLogical>iConvertSubscriptIndexToLogical (line 26) Excluded indices must be nonnegative integers that reference the fit's input data points Error in curvefit.ensureLogical (line 18) exclude = iConvertSubscriptIndexToLogical(exclude, nPoints); Error in cfit/plot (line 46) outliers = curvefit.ensureLogical( outliers, numel( ydata ) );
我觉得它必须与the documentation中所述的某种可变切片一起工作,我只是想不通。
答案 0 :(得分:0)
我能够将问题缩小到我正在使用的fitroutine。
TLDR:请勿在{{1}}循环中对图使用fitobjects(cfit
或sfit
)!
解决方案:
parfor
或nlinfit()
之类的包装代替lsqcurvefit()
。它们直接为您提供拟合参数,因此您可以在绘图时使用它们来调用fitfunction。如果您必须使用fit()
(由于某种原因,它是唯一能够或多或少一致地拟合我的数据的参数),请提取fit参数,然后使用单元格扩展调用fitfunction
fit()
据我所知fitfunc = @(a,b,c,d,e,x) ( ... );
[fitobject,gof,fitinfo] = fit(x,y,fitfunc,fitoptions(..));
vFitparam = coeffvalues(fitobject);
vFitparam_cell = num2cell(vFitparam);
plot(ax,x,fitfunc(vFitparam_cell{:},x), ... );
要求函数句柄具有后续参数(而不是向量),因此通过使用单元格,您可以避免这样的肿代码:
fit()