2

我正在尝试使用 并行计算一系列光谱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出来了。这是输出:

进入for循环

进入 parfor 循环

警告:PSD 已被 SPECTRUM 对象取代。PSD 仍然有效,但将来可能会被删除。请改用 SPECTRUM(或其功能形式 PWELCH)。

在 psd 中 33 在 parallel_function>make_general_channel/channel_general 在 885 在 remoteParallelFunction 在 30 使用 parallel_function 时出错(第 589 行)

需要向量(行或列)输入。

错误堆栈:psd.m at 37

有没有人遇到过这个?有没有更好的方法来并行化谱计算?

4

1 回答 1

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

于 2013-02-02T13:19:16.827 回答