Parforを用いてSimulink モデルを並列に実行する方法

5 vues (au cours des 30 derniers jours)
O.E
O.E le 15 Nov 2016
Commenté : O.E le 16 Nov 2016
1BitΔΣADCのSimulink モデルをParforを利用してローカルで並列実行したいと考えています。 シミュレーション時間を0~Tsimまでとし、入力信号(Sin波)の振幅をAとして並列実行し、 出力データをTo workspace (OUT_DATA)に出力しようと考えています。
%%%%%%%%%%パラメータ設定 %%%%%%%%%%%%%%%%
Sp=2^14; %サンプル点数
Ts=1; %サンプリング周期
OSR=64; %オーバーサンプリングレーシオ
fb=(1/Ts)/(2*OSR); %帯域 (OSR=fclk/(2*fb)) fb=fclk/(2*OSR))
fsin=fb/2; %信号帯域の半分の周波数の信号を使ってシミュレーション
Tsim=(Sp)*Ts; %システムのシミュレーション時間
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
J = [0,1,2,3,4,5.6]; % モデルに引き渡すパラメータの組
parfor i = 1:length(J)
A = J(i); % 使用するパラメータ
  sim('dsm')
B(i) = transpose(OUT_DATA);
end
このようにプログラムを組んだのですが、 ″ブロック線図 'dsm' では、[コンフィギュレーション パラメーター] ダイアログ内の 'StopTime' に指定された式 'Tsim' の評価中にエラーが発生しました: 関数または変数 'Tsim' が未定義です。″
とエラーが表示され実行することができませんでした。TsimはTsim=(Sp)*Tsと設定しているのですが、なぜ未定義となってしまうのでしょうか。

Réponse acceptée

Jiro Doke
Jiro Doke le 15 Nov 2016
Modifié(e) : Jiro Doke le 15 Nov 2016
これは、 parfor 内でループの外の変数が見えていないから起きます。一番簡単な対処法はループ内のコードを一つの関数としてまとめる方法です。
実際に dsim のモデル内でどの変数が必要か分かりませんが、仮に A, fsin, Tsim が使われている場合、それらを入力として受け付ける関数を書きます。
J = [0,1,2,3,4,5.6]; % モデルに引き渡すパラメータの組
parfor i = 1:length(J)
B{i} = simModel(J(i),fsin,Tsim);
end
%%%%%
function B = simModel(A,fsin,Tsim)
simOut = sim('dsm','SrcWorkspace','current');
OUT_DATA = get(simOut,'OUT_DATA'); % シミュレーション出力オブジェクトから抽出
B = transpose(OUT_DATA);
end
%%%%%
sim は既定の設定でベースワークスペースの変数を参照するため、関数内で実行するには SrcWorkspace current に設定する必要があります。また、それを行うと出力データはシミュレーション出力オブジェクトに格納されるので、抽出する必要があります。
参考:
  3 commentaires
Jiro Doke
Jiro Doke le 15 Nov 2016
すみません。
sim のオプションが間違っていました。回答を修正しましたのでもう一度試してみてください。
O.E
O.E le 16 Nov 2016
無事動作いたしました。 丁寧な御回答ありがとうございました。

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Parallel Computing Fundamentals dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by