使用 simout 收集数据,用于具有数千次运行的实验



我正在使用这段代码(如下所示(运行数千次的 Simulink 模型。我希望每次运行都收集所有结果。有没有办法收集每次运行的结果,然后组织它们?

我确实尝试了模拟,但我只跑了一次就得到了结果。

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

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

运行 1 的模拟

运行 2 的模拟等等

非常感谢您的帮助

一个 1000 x 2 的双精度浮点数数组仅占用 16000 个字节:

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

因此,您应该能够毫无困难地将数以万计的内存放入内存中。如果模拟输出的大小始终相同,则可以将它们存储在三维数组中:

% 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

如果您确实生成了太多数据而无法一次放入内存,但您希望将其存储在一个文件中并能够访问其中的任意子集进行分析,则可能需要查看处理大型 MAT 文件的技术。这将比处理内存中的数据慢得多。

或者,您可以尝试使用模拟数据检查器,尽管我不知道它是否可以处理内存太大的数据。

最新更新