经历::在网上找了很多方法,都没有实现在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;
 
 

Matlab中调用VS编译的exe文件并传递变量 的方法的更多相关文章

  1. [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件

    原文:http://www.crifan.com/csharp_call_explorer_to_open_destinate_folder_and_select_specific_file/ C#中 ...

  2. 在InstallShield中发布单一的Setup.exe文件

    原文:在InstallShield中发布单一的Setup.exe文件 InstallShield默认的Release模式下,生成了一个setup.exe文件,一个msi文件,以及一些其它的杂项文件. ...

  3. bat调用exe文件并且传递参数

    bat调用exe文件并且传递参数 bat调用exe,并且传递日期参数,代码: @echo off cd "E:\SublimeWorks\exe" start xyzj_shrjj ...

  4. MFC exe文件生成的图标更改方法

    MFC exe文件生成的图标更改方法 https://blog.csdn.net/txwtech/article/details/92980545

  5. PHP HTML混写,PHP中把大块HTML文本直接赋值给字符串变量的方法

    PHP HTML混写,PHP中把大块HTML文本直接赋值给字符串变量的方法 使用HEREDOC/NOWDOCHEREDOC和NOWDOC是PHP5.3开始支持的一种新特性,它允许在程序中使用一种自定义 ...

  6. (原)matlab中使用mex编译多个cpp文件

    以前一直是mex一个文件.刚才需要编译多个文件(如a.cpp调用b.cpp的函数,b.cpp调用c.cpp的函数).如果只是mex a.cpp,提示函数找不到函数. 突然想到mex c.cpp b.c ...

  7. ASP.NET、C#调用外部可执行exe文件--多种方案

    一. try { //方法一 //调用自己的exe传递参数 //Process proc = new Process(); //proc.StartInfo.FileName = @"D:\ ...

  8. Matlab中调用第三方Java代码

    搞了一天,才算搞定. 第一步:定位Matlab中Java环境的ext目录 新建一个M script文件,或者直接在Matlab的交互式命令行中输入: disp(java.lang.System.get ...

  9. MFC在一个工程中启动其他工程的exe文件

    说明:有的时候把两个工程合并,但是偷懒不想在工程中添加代码,所以想到了这个办法,仅限偷懒哈哈哈哈 方法:新建一个主程序,在主程序的界面中添加按钮,在按钮的程序代码中添加以下语句: void CMain ...

随机推荐

  1. Python的日期函数datetime使用

    前记:Python的时间模块,time,datetime功能很丰富,要多源码学习一下,常用的strftime()和strptime()等等要灵活使用 import datetime now_time ...

  2. 『TensorFlow』滑动平均

    滑动平均会为目标变量维护一个影子变量,影子变量不影响原变量的更新维护,但是在测试或者实际预测过程中(非训练时),使用影子变量代替原变量. 1.滑动平均求解对象初始化 ema = tf.train.Ex ...

  3. [luogu P3648] [APIO2014]序列分割

    [luogu P3648] [APIO2014]序列分割 题目描述 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序 ...

  4. mysql查询出相同数据出现的次数,统计相同值的数量

    1.可以使用count SELECT count(name='A' OR NULL) FROM table 2.用sum SELECT sum(if( = 'A', 1, 0)) FROM table ...

  5. Spring Security Oauth2 单点登录案例实现和执行流程剖析

    Spring Security Oauth2 OAuth是一个关于授权的开放网络标准,在全世界得到的广泛的应用,目前是2.0的版本.OAuth2在“客户端”与“服务提供商”之间,设置了一个授权层(au ...

  6. MySQL 用户连接与用户线程

    本文转载自公众号数据库随笔,作者happypig 微信看起来麻烦 pig已经好长一段时间没有分享文章了,有点对不起订阅的朋友.最近在做比较复杂跟困难的事情,也并不一定最终会有成果,因此必须对此沉默. ...

  7. JAVA 根据设置的概率生成随机数

    import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; i ...

  8. 打开本页N秒后跳转页面

    在head标签里面 <meta http-equiv="refresh" content="4;url=" />

  9. 学习java的第4天 (2019-03-21 11:49)

    学习java的第4天       好文要顶 关注我 收藏该文   里里零关注 - 0粉丝 - 0       0 0         posted on 2019-03-21 11:49 编辑 抱歉! ...

  10. 第二周例行报告psp

    此作业要求详见https://edu.cnblogs.com/campus/nenu/2018fall/homework/2127 (1)psp表 本周进度条 累计进度图 本周PSP饼状图