博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Matlab中调用VS编译的exe文件并传递变量 的方法

Posted on 2017-03-06 11:49  warmbeast  阅读(4348)  评论(0编辑  收藏  举报

经历::在网上找了很多方法,都没有实现在matlab中调用vs的exe文件并且能够传递变量参数,一些小细节花费了自己很多时间,比喻忽略了一些空格!  网上很多的方法都是纯粹复制别人的方法,自己都没有去验证,所以在网上找答案时花了大量时间去看了一些重复而且并不正确的方法;

启示::在参考别人的方法时,一定要有自己的思考,上网搜答案一定要有选择性,最好找到一种权威、可信度比较高的机构写的方法,自己认真去验证一次,不行就放弃,不要反复去看一些重复的方法,兜着绕圈子,浪费大量时间!!!

问题解决:

在matlab中有多种命令来调用外部程序编译的exe文件:

1. 调用外部程序的命令
在matlab中执行一条外部系统命令的方法(不仅仅是Unix系的,windows也是一样的):
! command
比如说linux下
! ls
! mkdir test
更好的使用方法(这个方法也是适用于windows的):
system('command')
[status, results]=system('command')
[status, results]=system('command','-echo')
第一个直接在命令窗口中显示运行中的提示
第二个如果调用成功,status会返回0,如果失败返回其它值,在命令窗口是没有输出的,但是所有字符保存在results中
第三个和第二个一样,只是还强制在命令窗口中显示运行信息。
 
这个方法之所以更好,还有一个原因就是可以给命令传递字符变量。(调用system()可以传递字符变量,而用!command不能传递变量,只能传递常量);
 
举例说明system()调用exe文件:
 
1>、test.cpp文件
#include "stdafx.h"
#include<stdlib.h>
#include<iostream>
using namespace std;
 
/*char* r[] 字符指针数组 接受传递来的字符串,其中r[0]指针往往存储程序自身的名称,比喻:"test.exe",其它字符参数(程序中要用的参数)依次存储在r[1]  、r[2]......中*/
int main(int argc, char* r[])                                          
{
     char q=*r[1];
     int  a=1;
     int  b=2;
     int  c=a+b;
cout<<c<<q<<endl;
    return 0;
}
 
2>、test.exe文件
将test.cpp在vs中编译运行,生成test.exe文件;
 
3>、test.m文件 (在matlab中编写简单的test.m文件)
clear
clc
sym x;   //定义一个变量x,不用定义这一步也可以
x='w';
cmd=['path\test.exe' ' ' x]; //千万千万注意空格['path\test.exe' ' ' x];  译为 [‘path\test.exe'空格‘空格’空格x] ; 少一个空格都会出错
system(cmd,'-echo');         // 也可以这样写[status, result]=system(cmd,'-echo'); status用来存储程序调用的状态,成功调用为0,否则为1;result用来存储执行的结果;
                                       //system(['path\test.exe' ' ' x],'-echo'); 直接将cmd的值放在system()中也是一样的;
 
在matlab中运行test.m文件,就会调用test.exe 文件,并且将变量x的值'w'传递给text.exe, 在test.cpp中*r[1]的值就为w, 运行后在matlab的command windows中显示运行结果:3w; 至此,调用结束;
 
注意:test.exe文件路径名称 path中,不能带空格,否则matlab不能识别路径!!!!
 
2、如何将matlab的.m文件编译成.exe文件(在matlab2010b上实现的)
1>、在matlab中新建一个function文件,编写你所需要实现的函数文件保存为function.m,文件名称最好与函数名一致;
2>、在matlab的 command windows中输入: mcc  -m  function   按下回车键运行,运行结束就会生成function.exe文件
 
 
3、 系统路径(环境变量)
用getenv('PATH')命令可以获得当前的“系统路径”(可执行文件的搜索路径)。
 
在matlab中可以这样增加系统路径(本次matlab会话有效,重启失效):
path1 = getenv('PATH')             %获得系统路径的字符串
path1 = [path1 ':/usr/local/bin']   %字符串中加入自己要的路径
setenv('PATH', path1)                %设置系统路径
!echo $PATH                              %输出以查看之
 
要想每次使用matlab都有效,可以在matlab的启动脚本matlabroot/toolbox/local/startuprc.m中加入上面的代码。
 
当然你也可以自己在shell中改整个系统路径的PATH喽。
 
偶然又看到Linux下可以用下面这样调用系统命令,未研究,补充记下(http://www.zdh1909.com/html/matlab/17112.html):
if isunix
  unix(['epstopdf ',filename,'.eps']);              % 如果是 linux 系统的话,将 eps 图像转换为 pdf 图像
end
 
另外,执行系统命令时可能遇到Matlab自带的库不兼容外部程序的情况:
比如:$MARLAB/version/sys/os/glnx86/libgfortran.so.3: version `GFORTRAN 1.4' not found (required by exe_filename)
解决办法就是把系统的库链接过去:sudo ln -sf /usr/lib/i386-linux-gnu/libgfortran.so.3.0.0 $MATLAB/sys/os/glnx86/libgfortran.so.3
(参考:http://judsonsnotes.com/notes/index.php?option=com_content&view=article&id=611:matlab-running-external-programs&catid=57:programming&Itemid=81)
 
参考英文资料:
 
(以上内容部分来自http://blog.sina.com.cn/felonwan;