收集使用simout数据与成千上万运行的实验

问题描述 投票:0回答:1

我使用这个代码(如下图所示),以运行数以千计运行的Simulink模型。我想每次运行,收集所有的结果。有没有一种方法来收集结果每次运行,然后组织他们?

我也尝试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

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

运行1 simout

运行2等的simout

你的帮助是高度赞赏

matlab simulink
1个回答
1
投票

双精度浮点数的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,虽然我不知道这是否能够处理的数据太大的记忆。

© www.soinside.com 2019 - 2024. All rights reserved.