代码正确时,Matlab违反透明性错误

时间:2018-08-17 13:13:53

标签: matlab parallel-processing

我正在使用Matlab并行工具箱进行并行计算。我已经仔细检查了代码的变量定义,它符合parfor命令的要求。但是,Matlab仍然告诉我“透明违反错误”,您能帮我解决这个问题吗?

这是源代码。非常感谢。

load Wind80.mat
Wspeed_80 = Wind80;
TotalLoc = 4000;
Nloc = 5; % no of loc of each run
maxrun = ceil(TotalLoc/Nloc);
StrInfo.Pstr = 1; 
StrInfo.Tstr = 0:4:72;
tic
parfor run = 1:maxrun
   WT1 = [];
   WT2 = [];
   [WT1, WT2] = CompWTGenFun(run, Nloc, TotalLoc, StrInfo);
   filenm = ['ResultPara' num2str(StrInfo.Pstr) 'Run' num2str(run) '.mat' ];
   save(filenm, 'WT1', 'WT2', '-mat');
   clear WT1 WT2
end
toc

1 个答案:

答案 0 :(得分:1)

您不能在save循环内使用parfor函数,因为这将导致transparency violation。当功能需要调查(或修改)其调用工作空间时,就会发生透明冲突。不幸的是,save是这样做的-在您的代码中,您给save命令赋予了要保存的变量的 names ,然后save实现尝试从其调用工作空间(即parfor循环的主体)中提取值。

解决方法是将对save的调用隐藏在一个单独的函数中,换句话说,您需要类似以下的内容:

parfor ...
    mySave(filenm, WT1, WT2);
end
# ...
function mySave(filenm, WT1, WT2)
    save(filenm, 'WT1', 'WT2', '-mat');
end

之所以可行,是因为透明度约束仅适用于直接出现在parfor循环主体中的代码。

如评论中所述,您拥有的clear命令不是必需的,并且会再次导致透明性冲突。