我正在尝试使用parfor
并行计算一系列光谱,但我的parfor
循环崩溃。
我相信这次崩溃不是因为没有预先分配变量,而是因为matlab以不同的方式计算频谱:
这是一个演示问题的简单脚本(在Ubuntu& R2012b上):
% allocate the data and objects
mtm = spectrum.mtm;
data = rand(3000,1);
Fs = 500;
fprintf('Entering for loop\n');
for i = 1:5
h = psd(mtm, data, 'Fs', Fs);
end
fprintf('Entering parfor loop\n');
parfor i = 1:10
h = psd(mtm, data, 'Fs', Fs);
end
for
循环正确执行,但parfor
错误输出。这是输出:
输入循环
输入parfor循环
警告:PSD已被替换 通过SPECTRUM对象。 PSD仍然有效,但将来可能会删除。 请改用SPECTRUM(或其功能形式PWELCH)。
在psd at 33 In parallel_function> make_general_channel / channel_general at 885 In remoteParallelFunction at 30错误使用parallel_function(第589行)
需要向量(行或列)输入。
错误堆栈:psd.m at 37
之前有没有遇到过这个?是否有更好的方法来并行化频谱计算?
答案 0 :(得分:1)
在咨询Mathworks支持后,通过在spectrum.mtm
循环内移动parfor
对象的创建来解决问题。
fprintf('Entering parfor loop\n');
parfor i = 1:10
mtm = spectrum.mtm;
h = psd(mtm, data, 'Fs', Fs);
end
mtm = spectrum.mtm;
fprintf('Entering parfor loop\n');
parfor i = 1:10
h = psd(mtm, data, 'Fs', Fs);
end
根本问题是spectrum.mtm
是一个simulink对象,而不是matlab对象,并且simulink对象不能在parfor
循环中使用。