用于管理 Matlab 运行的框架



TL;DR:如何在 Matlab 中管理自定义仿真运行?最后有详细的问题。

我正在使用 matlab,在那里我创建了一些代码来检查各种参数对模拟系统的影响。它有很多输入和输出,但 MWE 将是:

function [number2x,next_letter] = test(number, letter) 
number2x = number * 2;
next_letter = letter + 1;
disp(['next letter is ' next_letter])
disp(['number times 2 is ' num2str(number2x)])
end

如果这就是要测试的全部内容,这将起作用。然而,随着时间的推移,必须添加多个新的输入和输出。另外,由于经过测试的参数越来越多,因此必须创建某种日志:

xlswrite('testfile.xlsx',[num2str(number), letter,num2str(number2x),next_letter],'append');

此外,由于计算需要几个小时,并且应该在夜间运行,因此必须在一个点启动多个参数集。这可以通过在一行中[x1,y1] = test(1,'a');[x2,y2] = test(2,'b');或在旧任务仍在运行时添加新任务轻松完成。但是,通过这种方式,您无法跟踪有多少仍然打开。

因此,总的来说,我需要某种测试框架,它可以跟上不断变化的 inpus 和输出,跟踪已经完成的计算,理想情况下还可以处理开放运行。

我觉得我不能是唯一一个面临这个问题的人,事实上,我认为很多人都面临这个问题,Mathworks已经想出了一个解决方案。

对于 Simulink,这是以 Simluationmanager 的形式完成的,但对于 Matlab 函数,我发现最接近的是测试框架(下面的示例),它似乎更适用于软件开发和调试,而不是我正在尝试的内容。在某些时候,似乎有第三方解决方案,但它们不再支持此测试框架。

function solutions = sampleTest
solutions = functiontests({@paramtertest});
end
function paramtertest(vargin)
test(1,'a');
test(2,'b');
end
function [number2x,next_letter] = test(number, letter) 
number2x = number * 2;
next_letter = letter + 1;
disp(['next letter is ' next_letter])
disp(['number times 2 is ' num2str(number2x)])
xlswrite('testfile.xlsx',[num2str(number), letter,num2str(number2x),next_letter],'append');
end

或者,我可以将测试创建为类,创建一个类似于 Simulationmanager 的界面,创建许多用于管理输入和输出的函数并可视化进度,然后生成多个实例,如果我想在运行模拟时设置一组新参数。可能,但很多工作不直接涉及模拟。

总共会出现以下问题:

  • Matlab 函数中是否有我迄今为止完全错过的用于管理模拟的内置功能?
  • 测试框架可以用于此目的吗?
  • 是否已经有一些框架(不是来自Mathworks)可以处理这个问题?
  • 如果我创建自己的类,是否可以单独运行多个实例并跟踪自己的进度?这些是同时处理还是 matlab 最终会按照它们开始的顺序运行?

我知道这个问题有点题外话:推荐或找到一个工具、库或最喜欢的站外资源区域。如果你觉得太多了,请关注最后一个问题。

谢谢!

我已经使用 GUI 元素进行了类似的测试。仿真的基本部分是在循环while例如:

iter = 0;
iter_max = 5; %the number of your times, you will call script
accu_step = 2; %the accuracy of stored data
Alphabet = 'abcdefghijklmnopqrstuvwxyz'
while iter < iter_max
iter = iter+1;
[x1,y1] = test(i,Alphabet(i));
end

现在,您应该在计算脚本中创建一个进度条的句柄。它将显示您正在哪一步,以及当前步骤的进度。

global h;
global iter_opt;
if isempty(h)
h=waitbar(0,'Solving...');
else
waitbar(t/t_end,h,sprintf('Solving... current step is:%d',iter));
end

您没有指定使用哪个函数,例如,如果它是时间相关的,则上面的t/t_end示例是对当前进度的估计。

结果的求解也需要在每次执行循环时进行更改,例如:

global iter;
i_line = (t_end/accu_step+2)*(iter-1);
xlswrite('results.xlsx',{'ITERATION ', iter},sheet,strcat('A',num2str(i_line+5)))
xlswrite('results.xlsx',results_matrix(1:6),sheet,strcat('D',num2str(i_line+5)))

上面的示例还假设您的结果与时间相关,因此您每 2 个时间单位(天、小时、分钟、您需要的内容)存储数据,从t_0t_end,步骤之间还有 2 行分隔。列数只是示例,您可以根据需要进行调整。

计算完成后,您可以使用以下命令关闭waitbar

global h
close(h)

最新更新