经历::在网上找了很多方法,都没有实现在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自学:第二章 浮点数

    >>>0.1 + 0.1 0.2 >>>0.2 + 0.2 0.4 >>>2 * 0.1 0.2 >>>2 * 0.2 0.4

  2. 联盟链初识以及Fabric环境搭建流程

    这篇文章首先简单介绍了联盟链是什么,再详细的介绍了Fabric环境搭建的整个流程. 区块链分类: 以参与方式分类,区块链可以分为:公有链.联盟链和私有链. 定义: 我们知道区块链就是一个分布式的,去中 ...

  3. ajax上传下载自定义圆形滚动条

    demo地址:https://pan.baidu.com/s/1qYNYCFE 因为项目需要在上传文件的时候,知道上传的进度,所以封装了一个方法,在上传文件的时候动态显示上传进度,主要根据XMLHtt ...

  4. Steam饥荒

    存档回滚 D:\Program Files (x86)\Steam\userdata\***\219740\remote 巨人国是survival_数字,海难是shipwreck_数字,哈姆雷特是po ...

  5. linux安装elasticsearch及遇到的各种问题

    1.获取elasticsearch https://www.elastic.co/downloads/elasticsearch 终端输入赋值的下载链接进行下载 wget https://artifa ...

  6. AngularJS +Kendo UI Grid template

    var dataSource = new kendo.data.DataSource({ transport: { dataType: "json", read: inputUri ...

  7. animation特效

    在小程序中的使用: <view class='test1'> <image src='/images/light.png'></image> </view&g ...

  8. 第五周作业--测试与版本发布(Alpha版本)

    github传送门:https://github.com/Bubblegod/StardrewValley 一.BUG以及修复 a.修复的BUG: 1.存在着运行环境改变后,资源找不到问题 BUG描述 ...

  9. Android : App客户端与后台服务的AIDL通信以及后台服务的JNI接口实现

    一.APP客户端进程与后台服务进程的AIDL通信 AIDL(Android Interface definition language-“接口定义语言”) 是 Android 提供的一种进程间通信 ( ...

  10. centos 解决中文支持问题, 如此修改可以修正eclipse 乱码问题。

    一.中文支持 安装中文语言包: yum groupinstall chinese-support 修改字符编码配置,没有这个文件就创建它: vim /etc/sysconfig/i18n 为 LANG ...