• Windows下利用批处理自动运行matlab并不断更改参数


    问题:我写了一段matlab代码,用于计算某个特定参数下面的结果。我想知道该参数对结果的影响。也就是只变动这一个参数,然后运行代码,再变动,再运行。这显然是个重复性的工作。假如使用批处理,能大大节约不必要的工作量。

    第一步,将matlab输出结果到一个txt文件中。

    方法:在matlab脚本里利用fprintf函数。用法和C语言相似
    例子:
    想输出 var 和fval这俩参数。

    计算完毕以后添加

    Fid = fopen('OutputResult.txt','a');
    fprintf(Fid,'%8.4f    %.4f
    ',var,fval);
    

    fopen中的a代表追加到文件末尾,没有该文件自动创建。

    注意fprintf第一个参数是文件ID,如果是1则代表屏幕。%.4f代表小数点后保留4位。8代表总共占8个字符间距,如果超出会自动扩展。

    最后添加

    fclose(Fid);
    

    第二步,利用批处理调用matlab

    调用方法:

    matlab -nosplash -nodesktop  -r main
    

    -r代表 run
    main是你脚本的名字,注意不带m
    -nosplash代表不显示启动画面,-nodesktop代表不启动matlab GUI窗口

    此外还可能有用的选项
    -nodisplay -timing -logfile log -wait
    其中-wait是matlab运行了以后暂停(也就是不会执行cmd的下一条语句,但是你手动关闭白色窗口以后会执行下一个命令)

    详细的含义看
    https://blog.csdn.net/qq_16019107/article/details/77882017

    如果打开cmd,输入上述命令,就可以发现matlab以命令行方式运行了。(当然还是会打开一个白色的窗口,目前还没找到解决方式)

    然后你把上面的命令拷贝到一个新建的txt文件里,把文件后缀的txt改成bat保存就好了。双击该.bat文件就相当于cmd里输入命令。

    注意:要将matlab添加到环境变量里,一般安装的时候就自动添加了。

    第三步,每次运行之前自动变更特定参数

    这就需要用linux里面的sed命令了,它可以自动搜寻并替换特定字符串。
    Windows里的话,要专门下载一个小程序。
    下载地址:
    https://sourceforge.net/projects/gnuwin32/files/sed/4.2.1/
    详见
    http://blog.sciencenet.cn/home.php?mod=space&uid=858128&do=blog&quickforward=1&id=994394

    使用方法:和linux的sed一样。
    例如我要某一行的T=500替换为T=400

    D:AppGnuWin32insed.exe -i "s/T=[0-9]{1,}/T=400/" 你的脚本名.m
    

    前面的路径是你的sed安装的位置
    -i表示直接在该文件上改动,不加的话会另外复制一个文件在其基础上改动。
    s代表替换
    [0-9]{1,}是正则表达式,表示任意数字,并且连续的数字当作一个。

    第四步(最后),顺序地改变参数并依次运行matlab

    到这里有一个问题,假如将这两行复制3遍来分别得到T=400 500 600的结果的时候,会发现matlab会同时运行。
    例如

    matlab -nosplash -nodesktop  -r main
    D:AppGnuWin32insed.exe -i "s/T=[0-9]{1,}/T=400/" 你的脚本名.m
    matlab -nosplash -nodesktop  -r main
    D:AppGnuWin32insed.exe -i "s/T=[0-9]{1,}/T=500/" 你的脚本名.m
    matlab -nosplash -nodesktop  -r main
    D:AppGnuWin32insed.exe -i "s/T=[0-9]{1,}/T=600/" 你的脚本名.m
    

    这时候会一次性打开3个matlab程序同时运行。因为3个matlab是在不同的进程的,互相不干扰。但是这样计算机可能会崩掉。如何让它算完一个参数再算一个呢?

    一种方法是计时,等到一个matlab计算完了再开下一个。期间暂停一下。
    暂停方法:

    ping 127.0.0.1 -n 100 >nul
    

    -n后面是几,就是暂停几秒 (实际上是ping了几次,因为这个地址永远ping不通,每隔一秒会自动重试)
    具体运行几秒,可以自己预估一下,或者在MATLAB代码里加个计时的语句。

    一种方法是监视有没有一个叫“MATLAB.exe”的程序,如果有,就不启动下一个MATLAB.exe。
    详情见
    https://jingyan.baidu.com/article/67662997aed36b54d41b845e.html

    补充:用set和for循环来简化bat脚本

    可以用set和for循环来简化bat脚本
    set用法:
    例如将这三句放在bat脚本的开头

    set sed=D:AppGnuWin32insed.exe
    set runmat=start  matlab -nosplash -nodesktop -r  main
    set "wait=ping -n 120 127.1 >nul"
    

    和C语言里面的宏一个用法。就是在预处理时简单的字符串替换。
    后面用该变量的时候要用%括起来
    例如%runmat%

    for用法

    for %%i in (字符串1,字符串2,字符串3) do (
    循环的内容
    )
    

    运行机理:相当于把循环变量i分别替换成 字符串1,字符串2,字符串3
    然后再运行循环体的内容
    注意必须循环变量必须是单个字母 例如i,j,k
    此外循环变量i在引用的时候也要用两个百分号,即%%i

    set var=sH
    set range=(0.85,0.875,0.9,0.925,0.95,0.975,1.00)
    	for  %%i in %range% do (
    		echo %var%=%%i
    		%sed% -i "s/%var%=.*/%var%=%%i;/" matlab脚本名.m
    		%runmat% & %wait%
    	)
    

    运行时就是每次做3行命令

    1. 播报sH=0.85/0.875…
    2. 更改matlab脚本内容 把sH=xxx替换为sH=0.85/0.875…
    3. 启动matlab并等待120s

    不断循环着三行命令,把%%i分别替换成0.85,0.875,0.9,0.925,0.95,0.975,1.00
    注意这也是简单的字符串替换。

    在批处理里面,大部分变量都默认是字符串,而非像正规编程语言(比如C)里面认为是数字。

    顺带一提%runmat% & %wait% 这样写就是先运行%runmat%再运行%wait%,把两行命令写到一行里罢了。

    题外话:

    本文相当初级,本人没正规学过编程。有错误会不断补充改正。以解决问题为核心,就不仔细推敲代码的精简和巧妙了,能运行就行。对工程师来说,解决问题才是关键。

    虽然这么说,也只是因为自己编程知识太贫乏。另外感觉批处理实在是太难用了,连or这样简单的功能都不能直接实现。powershell应该比它强,但是试了一下,powershell启动matlab的时候识别不了参数,也就是说它只能打开GUI版本的matlab.

    python利用os.system模块应该也能调用matlab,就是python通过调用cmd调用matlab。使用方法据说是

    os.system("cmd里的命令")
    

    ,转了个圈还是用的批处理。当然这样的好处是能用python里面丰富的功能。此外python应该也有直接调用matlab的接口。目前还没学习到,以后再说。

    另外利用ping暂停显然只是个权宜之计,以后有更好的办法再来。

  • 相关阅读:
    Jmeter测试webservice服务
    【转】webservice 测试地址
    ADB(Android Debug Bridge)小结
    Access computer files on iPad without using iTunes.
    ياخشىمۇ سىز
    网络威胁实时地图(CyberThread Real-time Map)
    π
    基于网络爬虫的小湖知识图谱系统 测试心得
    第一次迭代开发心得
    项目数据库设计心得
  • 原文地址:https://www.cnblogs.com/chunleili/p/12758197.html
Copyright © 2020-2023  润新知