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

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

方法:在matlab脚本里利用fprintf函数。用法和C语言相似

例子:

想输出 var 和fval这俩参数。

在脚本开头添加

Fid = fopen(‘OutputResult.txt’,‘a’);

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

计算完毕以后添加

fprintf(Fid,’%8.4f %.4f\n’,var,fval);

注意第一个参数是文件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的下一条语句,但是你手动关闭白色窗口以后会执行下一个命令)

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

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

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

使用方法:和linux的sed一样。

例如我要某一行的T=500替换为T=400

D:\App\GnuWin32\bin\sed.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:\App\GnuWin32\bin\sed.exe -i "s/T=[0-9]\{1,\}/T=400/" 你的脚本名.m

matlab -nosplash -nodesktop -r main

D:\App\GnuWin32\bin\sed.exe -i "s/T=[0-9]\{1,\}/T=500/" 你的脚本名.m

matlab -nosplash -nodesktop -r main

D:\App\GnuWin32\bin\sed.exe -i "s/T=[0-9]\{1,\}/T=600/" 你的脚本名.m

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

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

暂停方法:ping 127.0.0.1 -n 100 >nul

-n后面是几,就是暂停几秒

具体运行几秒,可以自己预估一下,或者在MATLAB代码里加个计时的语句。

35f4110fe8639bf61b9d8803c86277d2.png

de638df49f1d5a3342eecff86bcb011e.png

beidou111

发布了18 篇原创文章 · 获赞 16 · 访问量 4679

私信

关注

标签:exe,Windows,nosplash,批处理,sed,参数,matlab,main

来源: https://blog.csdn.net/weixin_43940314/article/details/104125554

更多推荐