在parfor循环中计算PSD但在循环中计算PSD的错误

时间:2013-02-01 17:25:11

标签: matlab

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

之前有没有遇到过这个?是否有更好的方法来并行化频谱计算?

1 个答案:

答案 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循环中使用。