Simulation with large Data and SimulationData.DatasetRef Objects; Avoiding eval
3 ビュー (過去 30 日間)
古いコメントを表示
Hi everyone,
for my PhD project I need to run simulations in Simulink. In a Monte Carlo Approach I want to simulate many inputs (order of several 100) that I randomly generate. As these Signal Timeseries' require a lot of Memory, so I opted for using DatasetRef Objects: https://de.mathworks.com/help/simulink/slref/simulink.simulationdata.datasetref-class.html
As also described here: https://de.mathworks.com/help/simulink/ug/stream-input-data-for-a-parallel-simulation.html I want to stream my Data. In the example however they have their Datasets for simulations named Road1, Road2 etc, which I have read is bad practice, so I want to avoid it.
I already learned, that I can save my data as a Cell Array of datasets that each contain a timeseries with input data. However I cannot create DatasetRef Object from those entries to hand over to parsim, as the Simulink.SimulationData.DatasetRef() function requires a variable name as an input, but does not accept "Data{i}" as a variable name.
Unfortunately the Data is to large for upload but my code would look like this:
Store = matfile(append(path,"test.mat"));
numTestCases=length(Store.Data);
for i=1:numTestCases
inputData(i)=Simulink.SimulationData.DatasetRef(append(path,"test.mat"),sprintf("Data{%i}",i));
end
And Store beeing:
Store =
matlab.io.MatFile
Properties:
Properties.Source: 'path\test.mat'
Properties.Writable: false
Properties.ProtectedLoading: false
Data: [20x1 cell]
Methods
Has someone here an idea how to avoid using eval to just create the datasets as Data1,Data2 etc?
Cheers and thank you
1 件のコメント
Alvaro
2022 年 11 月 28 日
編集済み: Alvaro
2022 年 11 月 28 日
You can look at what is loaded in the example given in the documentation that you linked by executing
structExample = load('suspn_3dof_test_cases.mat')
and you can see that it is not a cell array of datasets but a struct with fields Road1, Road2, etc.
It is possible to dynamically add fields to structs:
For example, see the struct generated by this code.
for i = 1:10
road = strcat('Road',num2str(i));
myStruct.(road) = rand(1,3);
end
Could you explain further why generating a struct in this manner would cause any issues?
Alternatively, you could consider converting your cell array to an struct using cell2struct.
https://www.mathworks.com/help/matlab/ref/cell2struct.html
回答 (1 件)
Smattering_Applause
2022 年 6 月 23 日
See the Alternative method within this link: https://www.mathworks.com/matlabcentral/answers/292111-how-can-i-save-the-contents-of-a-struct-to-a-mat-file#answer_226587
If you can make it a cell array you can make it a struct, then save the struct in that method and load and then you'll have variable names without eval.
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Sources についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!