代码正确时出现Matlab透明度冲突错误
我正在使用Matlab并行工具箱来做并行计算。我仔细检查了代码的变量定义,它符合parfor命令的要求。然而,Matlab仍然告诉我“透明度违规错误”,你能帮我解决这个问题吗 这是源代码。非常感谢你代码正确时出现Matlab透明度冲突错误,matlab,parallel-processing,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 =
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
不能在
parfor
循环中使用save
功能,因为这将导致错误。当函数需要查看(或修改)其调用工作区时,会发生透明度冲突。不幸的是,save
执行此操作-在代码中,您向save
命令提供要保存的变量的名称,save
实现尝试从其调用工作区(即parfor
循环的主体)提取值
解决方法是将对save
的调用隐藏在一个单独的函数中,换句话说,您需要如下内容:
parfor ...
mySave(filenm, WT1, WT2);
end
# ...
function mySave(filenm, WT1, WT2)
save(filenm, 'WT1', 'WT2', '-mat');
end
这是因为透明度约束仅适用于parfor
循环体中直接存在的代码
如评论中所述,您使用的
clear
命令是不必要的,并且会再次导致透明度冲突。不是解决方案,但有一些一般性的改进:将WT1
和WT2
初始化为空矩阵没有任何意义,而clear WT1 WT2
是一种悲观(clear
通常会减慢代码的速度)。关于这个问题:我认为这可能是因为MATLAB无法判断每个循环迭代的filenm
会有所不同。请尝试在循环外部生成文件名,然后在循环中保存(filenm{run},…)
。非常感谢。通过在parfor循环的子功能中移动“clear WT1 WT2”和“save”功能,问题得以解决。然后,Edric的答案似乎对您有所帮助。如果是这样,请单击答案左侧的灰色复选标记,将其标记为已接受。谢谢!非常感谢。通过移动“clear WT1 WT2”和“save”问题得以解决parfor循环的子函数中的函数。