我正在使用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
答案 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
命令不是必需的,并且会再次导致透明性冲突。