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 at 33 In parallel_function> make_general_channel / channel_general at 885 In remoteParallelFunction at 30 error using parallel_function(行589)

ベクトル(行または列)の入力が必要です。

エラースタック:37のpsd.m

誰かがこれに遭遇したことがありますか?スペクトル計算を並列化するためのより良い方法はありますか?

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、matlab オブジェクトではなく simulink オブジェクトであり、parforループで simulink オブジェクトを使用できないことです。

于 2013-02-02T13:19:16.827 に答える