【问题标题】:Parfor works with test data but not real dataParfor 适用于测试数据,但不适用于真实数据
【发布时间】:2018-09-06 20:04:26
【问题描述】:

我正在使用 Matlab 2016a。我有四个大小为 2044x1572x84 的矩阵,我试图对每个矩阵的每一列进行回归,以生成一个新的 2044x1572 回归系数矩阵。我需要使用 parfor; for 循环会花费太长时间。

当我使用下面的代码和测试数据(例如,使用 rand 制作四个 50x50x40 的矩阵)时,代码执行时没有错误。但是,当我尝试在具有完整 2044x1572x84 矩阵的集群中使用相同的代码时,我收到关于表的透明度违规错误:Error using table (line 247) Transparency violation error。我已经尝试修改表代码来解决这个问题,但只得到一套其他错误。

我不确定在这种情况下如何修复错误,特别是考虑到代码的成功似乎取决于输入数据的大小。我对 parfor 不是特别熟悉,如果对我可能做错的事情提供任何反馈,我们将不胜感激。

COEFF_LST=ones(2044,1572);

parfor i=1:2044
for j=1:1572

ZZ=squeeze(ARRAY_DETREND_L2_LST(i,j,:));
XX=squeeze(ARRAY_DETREND_L2_ONDVI(i,j,:));
YY=squeeze(ARRAY_DETREND_WB_85(i,j,:));
LL=squeeze(ARRAY_DETREND_L2_CNDVI(i,j,:));

T=table(ZZ,XX,YY,LL,'VariableNames',{'LST','ONDVI','DROUGHT','NDVI'});

lm=fitlm(T);
array=table2array(lm.Coefficients);
COEFF_LST(i,j)=array(3,1);

end
end

【问题讨论】:

  • 当您尝试将变量添加到 parfor 循环的主体时,也会出现透明度错误,请参阅:Lorens blog。您确定您对测试数据做了完全相同的事情吗?为什么不尝试将内部 for 循环放入子函数中。是否有必要在表中分配名称,为什么不直接创建数组/矩阵?
  • 您能否编辑上面的代码以使其独立(即定义所有输入,以便我可以复制粘贴并运行它)?另请参阅:minimal reproducible example.

标签: matlab matrix regression parfor


【解决方案1】:

table 构造函数在某些情况下使用inputname - 这可能会导致parfor 内部的透明度违规。我意识到这很不方便,但也许您可以尝试在单独的函数中“隐藏”table 调用。即

parfor ...
    T = myTableBuilder(ZZ,XX,...);
end

function t = myTableBuilder(varargin)
    t = table(varargin{:});
end

【讨论】:

  • 尝试此操作时,我收到错误“在此上下文中不允许函数定义。”我会继续努力的。
  • 尝试将myTableBuilder 放入它自己的myTableBuilder.m 文件中。 (最新版本的 MATLAB 允许您在脚本 .m 文件中定义函数)
  • 感谢您的帮助。我与我的 PI 交谈并意识到我可以完全不使用“表”来构建我的代码;这就是我所做的并且有效。
【解决方案2】:

在这种情况下,table 出现透明度错误,因此一个可行的简单解决方案是不使用 table

在这种情况下,代码是:

Predictor_Matrix=horzcat(ZZ,XX,YY);
    lm = fitlm(Predictor_Matrix,WW);

这适用于集群而不会引发任何错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2015-11-21
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    相关资源
    最近更新 更多