【问题标题】:Framework for Managing Matlab Runs管理 Matlab 运行的框架
【发布时间】:2019-04-08 13:31:07
【问题描述】:

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'); 在一行中完成,或者在旧任务仍在运行时添加新任务。但是,这样您就无法跟踪有多少仍处于打开状态。

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

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

对于 Simulink,这是以 Simluationmanager 的形式完成的,但对于 Matlab 函数,我发现最接近的是 Testing framework(下面的示例),这似乎是用于软件开发和调试,而不是用于我正在尝试什么。并且在某个时候似乎有3rd party solutions,但他们不再继续支持这个测试框架。

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 最终会按照它们开始的顺序运行?

我知道这个问题有点离题:推荐或查找工具、库或最喜欢的场外资源区域。如果觉得过分,请关注最后一个问题。

谢谢!

【问题讨论】:

    标签: matlab


    【解决方案1】:

    我已经使用 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)
    

    【讨论】:

      猜你喜欢
      • 2018-02-03
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      相关资源
      最近更新 更多