经历::在网上找了很多方法,都没有实现在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. Type I and type II errors | 第一类错误和第二类错误

    偶尔能看懂,但是死活记不住,归根结底是没有彻底理解! Type I and type II errors - wiki type I error is the rejection of a true  ...

  2. mvn dependency:tree的用法

    一.参考文档 https://maven.apache.org/plugins/maven-dependency-plugin/examples/resolving-conflicts-using-t ...

  3. 浅谈树状数组(为什么lowbit(x)=x&(-x)

    树状数组是一种支持单点修改和查询前缀和的数据结构 网上很多讲解它的博客了 这里重点讲一下为什么lowbit(x)=x&(-x) 树状数组代码量相对于线段树基本可以不计(太好写了) 因此NOIp ...

  4. Vue(七) 组件详解

    组件 (Component) 是 Vue.js 最核心的功能,也是整个框架设计最精彩的部分,当然也是最难掌握的. 组件与复用 组件用法 组件与创建 Vue 实例类似,需要注册后才可以使用.注册有全局注 ...

  5. Java数组声明、初始化

    维数组的声明方式:type var[]; 或type[] var; 声明数组时不能指定其长度(数组中元素的个数), Java中使用关键字new创建数组对象,格式为:数组名 = new 数组元素的类型 ...

  6. Quartz定时器+Spring + @Autowired注入 空指针异常

    在Quartz的定时方法里引用@Autowired注入Bean,会报空指针错误 解决办法: 第一种方法:(推荐,简单,亲测可行) 使用@Resource(name="指定要注入的Bean&q ...

  7. html实现滚动播报(原生JS实现)

    html实现滚动播报(原生JS实现) 废话不多说,先看一个简单的滚动效果(鼠标放上去的时候可以暂停滚动,谷歌版本 66.0.3359.139(正式版本)查看时会出现滚动混乱.单独提出来的时候不会,应该 ...

  8. 2/19 学习笔记(for in 、 del语句)

    for x in ...循环就是把每个元素代入变量x,然后执行缩进块的语句 del语句作用在变量上,而不是数据对象上 列表可以修改,而字符串和元组不能

  9. guava-retrying 源码解析(停止策略详解)

    一.停止策略相关类 1.停止策略接口:StopStrategy接口,只有一个抽象方法 // 是否应该停止重试.不同的停止策略有不同的实现.boolean shouldStop(Attempt fail ...

  10. wpf 控件简单介绍