代码正确时,Matlab透明度违规错误

628mspwn  于 2023-02-23  发布在  Matlab
关注(0)|答案(1)|浏览(1127)

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

dba5bblo1#

不能在parfor循环中使用save函数,因为这将导致transparency violation。当函数需要查看不幸的是,save就是这样做的--在代码中,您为save命令指定了要保存的变量的 * 名称 *,并且X1 M4 N1 X实现尝试从其调用工作空间(即,X1 M5 N1 X循环的主体)提取值。
解决方法是将对save的调用隐藏在一个单独的函数中,换句话说,您需要这样做:

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

这是因为透明约束只应用于直接出现在parfor循环体中的代码。
正如注解中提到的,您使用的clear命令是不必要的,并且会再次导致透明度冲突。

相关问题