Соберите данные, используя simout для эксперимента с тысячами прогонов - PullRequest
0 голосов
/ 04 февраля 2019

Я использую этот код (показанный ниже) для запуска модели 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

Собранные результаты должны отображать результаты каждого прогона.Например:

Simout из прогона 1

Simout из прогона 2 и так далее

Ваша помощь высоко ценится

1 Ответ

0 голосов
/ 04 февраля 2019

Массив чисел с плавающей точкой двойной точности 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-файлами .Это будет намного, намного медленнее, чем обработка данных в памяти.

В качестве альтернативы, вы можете попробовать использовать Simulation Data Inspector , хотя я не знаю, может ли это обрабатывать данные, слишком большие дляпамять.

...