使用 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,尽管我不知道它是否可以处理对于内存来说太大的数据。
我正在使用此代码(如下所示)运行 一个 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,尽管我不知道它是否可以处理对于内存来说太大的数据。