代码正确时出现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 =

我正在使用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

不能在
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循环的子函数中的函数。