MATLAB在parfor循环中绘图

时间:2019-01-14 19:42:33

标签: matlab plot matlab-figure parfor

我需要在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中所述的某种可变切片一起工作,我只是想不通。

1 个答案:

答案 0 :(得分:0)

我能够将问题缩小到我正在使用的fitroutine。

TLDR:请勿在{{1​​}}循环中对图使用fitobjects(cfitsfit)!

解决方案:

  1. 使用parfornlinfit()之类的包装代替lsqcurvefit()。它们直接为您提供拟合参数,因此您可以在绘图时使用它们来调用fitfunction。
  2. 如果您必须使用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()