您的位置:首页 > 运维架构 > Shell

Linux下c++调用自己编写的matlab函数:通过shell script system command实现

2015-02-06 20:44 639 查看

Scriptsvs. Functions

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


shell中执行

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: