Program files can beScriptsthat simply execute a series of MATLAB statements,or they canbefunctionsthat also accept input arguments and produce output. Bothscripts and functions contain MATLAB code,andbothare stored in text files with a .m extension.However,functions are more flexible and more easily extensible.
说的很笼统,两者的区别就是调用方式不一样,function更灵活更容易扩展。其实传递参数不是function的专属,Script也可以接受传来的参数。下面举一个很简单的例子,更容易理解2者在使用中的区别。
在实际开发中,很多时候需要通过shellscript或者shellcommand来执行matlab函数(以c++为例,这种方法可以看作除了matlabengine和动态链接库.so方式以外的实现c++与matlab交互的第三种途径)。
在shellscript里执行Matlab的脚本的命令语法如下:
matlab-nodesktop -nosplash - nojvm -r "[command];"
这句话的意思是最小化不加载图形界面打开Matlab并在命令提示符后输入command。这里的command可以是function也可以是script,调用时需要省略后缀名.m
假设要实现这样一个功能:c++传递一个数据文件的路径给matlab,matlab读取这一数据并进行运算。
方式一:通过matlabfunction
matlab函数,文件名为myFunc.m,内容如下:
function y =myFunc(dataDir) A=load(dataDir); %do your jobs... end
matlab-r "myfunc('~/WorkSpace/myproject/data/test.txt')"
方式二:通过matlabscript
matlab脚本,文件名为myFunc.m,内容如下:
A=load(dataDir); %do your jobs... exit;
shell中执行
matlab -r"dataDir='~/WorkSpace/myproject/data/test.txt';myFunc"
由此可见,这个简单的功能在如上2种方式下效果等同。只是参数位置不一样。注意:运行前先将myFunc.m所在目录添加到matlab搜索路径。在c++中要注意字符串的写法,漏掉字符就会导致命令无法识别。类似“matlab:1: eval: Syntax error: "("unexpected”这样的错误,这时应注意检查命令字符串是否写对:"-eval"is not a valid command line flag for MATLAB. The closestcorresponding command line flag is '-r"。
比如上例子中调用脚本的字符串:
string s = string("matlab -nodesktop -nojvm -nosplash -r ") + '"' + string("dataDir='") + shapeStatPath + string("';myFunc") + '"';
调用函数的字符串:
string s = string("matlab -nodesktop -nojvm -nosplash -r ") + '"' + "myFunc('" + shapeStatPath + "')" + '"';
另外,如果参数是复杂的数据结构,比如数组,是不可以通过这么简单的字符串传递参数的。不过,可以在c++中将其保存为文件,然后在matlab中load它;matlab处理完毕以后再将结果写入文件,c++再去读这个文件。。。
参考:
http://blog.sina.com.cn/s/blog_6595ee0601018omx.html
http://stackoverflow.com/questions/13927191/how-can-i-call-a-matlab-function-that-takes-text-input-from-the-command-line
http://www.mathworks.com/matlabcentral/answers/124713-i-am-getting-eval-flag-error-when-i-execute-matlab-eval-perf-ten_fold_validation-sub-1