使用 simout 收集数据以进行数千次运行的实验

Collect data using simout for an experiment with thousands of runs

我正在使用此代码(如下所示)运行 一个 Simulink 模型,用于数千个 运行s。我想为每个 运行 收集所有结果。 有没有办法收集每个 运行 的结果然后组织它们?

我确实尝试了 simout,但我得到的结果只有一个 运行。

Run(1).Settings={'....'};
Run(2).Setting={'....'};
....

dirout=sprintf('......,clock);
mkdir(dirout);
numofruns=length(Run); % or I can set it to 10000

for i=1:numofruns
counter=counter+1;
disp(['Run:'num2str(Counter) '/' num2str(numofruns)])
for j=1:size(Run(i).Settings,1)
set_param([modelname '/' Run(i).Settings{j,1} '/enabled/' 
Run(i).Settings{j,2}],'value', num2str(Run(i).Settings{j,3}));
end 
set_param(modelname,'StopTime',num2str(StopTime));
sim(modelname);
filename=sprintf('%s/simout_%05.0f.mat',dirout,i);
simout=simout';
save(filename,'simout');
end

收集的结果应该显示每个 运行 的结果。 例如:

simout of 运行 1

simout of 运行 2 等等

非常感谢您的帮助

一个1000×2的双精度浮点数数组只占16000字节:

>> myMatrix = rand(1000, 2);
>> whos('myMatrix')
  Name             Size            Bytes  Class     Attributes

  myMatrix      1000x2             16000  double              

所以你应该能够毫不费力地在内存中容纳数万个。如果您的模拟输出总是相同大小,您可以将它们存储在 3 维数组中:

% preallocate the array to prevent memory reallocation, which is slow
resultArray = zeros(numofruns, 1000, 2);

for i = 1:numofruns
    % run the simulation here, assume it returns 1000 x 2 matrix simout

    resultArray(i,:,:) = simout;
end

如果行数可能与下一个 运行 不同,您可以使用元胞数组:

resultCellArray = cell(numofruns);

for i = 1:numofruns
    % run simulation here

    resultCellArray{i} = simout;
end

如果您确实一次生成太多数据无法放入内存,但又想将其存储在一个文件中并能够访问其中的任意子集进行分析,您可能需要查看以下技术与 large MAT-files 合作。这将比在内存中处理数据慢得多。

或者,您可以尝试使用 Simulation Data Inspector,尽管我不知道它是否可以处理对于内存来说太大的数据。