構造体配列に対する代入

48 views (last 30 days)
Yuuki Arai
Yuuki Arai on 31 Oct 2024
out = parsim("モデル名");
tmp = zeros(length(out(1).xFinal.loggedStates.values), length(out)); %zeros(状態変数の数, 並列sim数)
for i = 1:length(out) %リスタートで指定する初期状態の形式をコピー
init(i).signals = out(i).xFinal.loggedStates;
end
init.signals.values = tmp; %初期状態となる値を何かしらの変数で更新したい
%その後setInitialStateを使って初期状態指定、simリスタート
並列シミュレーションをし動作点を取得した後、
何かしらのロジックで次の計算の初期値を動作点レベルで変更して再度シミュレーションを行うというループを考えています。
この動作の中で取得した動作点(out.xFinal)をもとにsimulationinputオブジェクト配列(init)を作成し、
その中のvalues配列を任意の値に編集したいのですが上手く代入ができません。
どのように記述すれば良いのでしょうか。
for文で1列1行ずつやれば出来なくはないですが実行時間の問題もありますので
あまり冗長なコードにはしたくないと思っています。

Answers (1)

交感神経優位なあかべぇ
質問者様のモデルでは、状態変数ブロックの数がひとつであり、その値は非スカラーと推察しますが、
下記の例では、状態変数ブロックの数が複数で、その値はすべてスカラーであると仮定して作成しました。
もし、状態変数ブロックの数が複数で、その値が非スカラーも含むのであれば、もう少しtmpのデータ構造を工夫する必要があると思いますが、とりあえず。
openExample("sldemo_househeat");% 適当な実行モデルサンプル
simin = Simulink.SimulationInput("sldemo_househeat");
% モデルコンフィグレーション設定 [最終状態]:「ON」 [最終の操作点を保存]: 「ON」 [形式]: 「構造体」
simin = simin.setModelParameter("SaveFinalState","on","SaveOperatingPoint","on","SaveFormat","structure");
simin = repmat(simin,2,1); % サンプルとして、とりあえず2回実行
out = parsim(simin);
[03-Nov-2024 05:58:46] Checking for availability of parallel pool... [03-Nov-2024 05:58:48] Running simulations... [03-Nov-2024 05:58:50] Completed 1 of 2 simulation runs [03-Nov-2024 05:58:51] Completed 2 of 2 simulation runs
%zeros(モデル内の状態変数ブロック数(ただし、各ブロックの値はスカラー), 並列sim数)
tmp = zeros(length(out(1).xFinal.loggedStates), length(out));
%何らかの方法で、tmpの値を書き換える----
% tmpの値を書き換える処理?
%-------------------------------------
init = Simulink.SimulationInput("sldemo_househeat");
init = repmat(init, length(out),1);
for i = 1 : length(out)
initSignals = struct('signals', num2cell(out(i).xFinal.loggedStates));% 構造体配列をsignalsフィールドの配列に変換
for j = 1 : length(initSignals)
initSignals(j).values = tmp(j,i); % valuesへの代入は、おそらく1つずつ代入していくしかないかと思います。
end
init(i) = init(i).setInitialState(initSignals);
end
parsim(init);% 更新した初期値で再実行
[03-Nov-2024 05:58:51] Checking for availability of parallel pool... [03-Nov-2024 05:58:51] Running simulations... [03-Nov-2024 05:58:51] Completed 1 of 2 simulation runs [03-Nov-2024 05:58:52] Completed 2 of 2 simulation runs

Products


Release

R2024a

Community Treasure Hunt

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

Start Hunting!