c_调用matlab函数(混合编程)

合集下载

VC与Matlab混合编程

VC与Matlab混合编程

VC与Matlab混合编程本⽂主要介绍VC与Matlab混合编程的两种⽅法,并详细介绍了VC向Matlab传递复杂数据:结构体的⽅法,有详细代码说明。

Matlab 主要⾯对科学计算、可视化以及交互式程序设计的⾼科技计算环境,但由于Matlab开发平台上开发的程序不能脱离Matlab运⾏环境,因⽽在处理⼀些实际应⽤问题时显得灵活性不⾜,⽽VC++则在⼀定程度上能够弥补这⼀漏洞,因此,将⼆者结合共⽤,各献其长,可以为科研⼯作和⼯程开发提供更为强⼤的技术⽀持。

Matlab作为控制系统设计的⼀种通⽤⼯具,它可以很⽅便的和VC进⾏连接。

⼀般⽽⾔,Matlab与VC混合编程的实现⽅法有很多种,这⾥主要介绍以下两种:1. VC调⽤Matlab Engine的⽅式:Matlab Engine是⼀组Matlab提供的接⼝函数,⽀持C/C++语⾔,Matlab Engine采⽤C/S(客户机/服务器)模式,Matlab作为后台服务器,⽽C/C++程序作为前台客户机,向Matlab Engine传递执⾏命令和数据信息,从Matlab Engine接收执⾏结果。

⽤户可以在前台应⽤程序中调⽤这些接⼝函数,实现对Matlab Engine的控制。

采⽤这种⽅法⼏乎能利⽤Matlab全部功能,但是需要在机器上安装Matlab软件,缺点是执⾏效率较低。

下⾯简单介绍下这种⽅式的实现步骤:1.1 API接⼝介绍先来介绍⼀组Matlab提供的引擎API接⼝:(仅作简单功能介绍,详细参数说明请参考Matlab帮助)Engine* engOpen(const char* startcmd)启动Matlab引擎int engClose(Engine* ep) 关闭Matlab引擎int engEvalString(Engine* ep, const char* string)执⾏Matlab表达式mxArray* engGetArray(Engine* ep, const char* name)获取⼀个变量数组的值int engPutArray(engine* ep, const mxArray* mp)设置⼀个变量数组的值int engPutVariable(Engine *ep, const char *name, const mxArray *pm)同上mxArray *engGetVariable(Engine *ep, const char *name)获取⼀个变量int engOutputBuffer(Engine* eP,char* p,int n)获取输出字符串1.2 VC环境配置要想在VC集成环境下调⽤Matlab引擎实现VC和Matlab的混合编程,⼀般需要经过以下⼏个必要的步骤:(以下以Matlab2008a和VS2005版本为例)(1)添加include路径:将“\extern\include”(在Matlab的安装路径下)路劲添加到VC编译器的include下(2)添加lib路径:将“\extern \lib\win32\microsoft” (在Matlab的安装路径下) 路径添加到VC编译器的lib下(3)加载lib:需要加载⾄少libmx.lib、libmat.lib、libeng.lib三个库(4)include头⽂件:在要使⽤ engine 函数的地⽅包含engine.h头⽂件1.3 引擎调⽤接下来就可以在VC中调⽤Matlab引擎了,简单的⽰例代码如下:#include "engine.h"#pragma comment(lib, "libeng.lib")#pragma comment(lib, "libmx.lib")#pragma comment(lib, "libmat.lib")void TestDeno(){Engine* pEng = NULL;if (!(pEng = engOpen(NULL))){printf("Open matlab enging fail!");return;}//call Engine plot A*sin(t)+B A=2 B=1mxArray *A = NULL;double init = 2;A = mxCreateDoubleMatrix(1, 1, mxREAL);memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));engPutVariable(pEng, "A", A);init = 1;memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));engPutVariable(pEng, "B", A);mxDestroyArray(A);Sleep(3*60*1000);engEvalString(pEng, "t=0:0.2:7;plot(t,A*sin(t)+B);");if(NULL != pEng){engClose(pEng);}}⽰例代码通过VC调⽤Matlab引擎,绘制正弦曲线,相对简单,就不再详细解释,效图如下:2. VC调⽤Matlab DLL的⽅式DLL是⼀个可执⾏的⼆进制⽂件。

C语言环境中调用Matlab程序指南

C语言环境中调用Matlab程序指南

C语言环境中调用Matlab程序指南甄梓宁znzhen@Matlab在计算方面功能强大、编写简单,但是要运行Matlab程序必须装有Matlab并且用户界面也不够完善,因此除了计算的其他部分采用C等更规范完备的语言进行编写是较好的选择。

本文就对如何在C程序中调用Matlab程序作说明。

在C程序中调用Matlab程序有两大类方法。

第一种是调用Matlab引擎,第二种是将m文件打包成dll文件在C语言环境下调用。

前者虽然易于实现,可以实时监控程序的运行,但是独立性差,需要安装完整版Matlab,且每次调用都会启动MATLAB.exe进程;后者则实现复杂,调试麻烦,但只需安装MCR(Matlab Component Runtime),耗费资源较少。

关于MCR,请见第四章的说明。

至于两种方法需要在C环境中如何配置请见第五章。

而反过来若要在Matlab下调用C程序则一般使用Matlab自带的mex工具,在此不作介绍。

一、调用Matlab引擎调用Matlab引擎可以在WIN32、MFC中使用,它的原理实际上相当于打开一个精简版的Matlab然后往里面输命令。

下面是调用Matlab中的加法程序add.m的例子。

先在Matlab的work目录下创建add.m文件并编写程序如下:function s = add (a, b)s = a+b;在C程序中,首先打开精简版的Matlab:(所需头文件,引用库等见第五章)Engine *ep = engOpen (NULL);编译运行后,会自动打开一个命令行监控窗口,输入pwd就可以看到当前的工作目录,于是需要先将工作目录转换至存放add.m的目录:engEvalString (ep, ”cd ..\\..\\work”);engEvalString是往Matlab里输命令的函数,显然我们的目标是成功运行:engEvalString (ep, ”s=add(a,b)”);当然,目前Matlab中并没有a和b两个变量,因此需要在C中初始化这两个变量并转换成Matlab基本变量类型mxArray,才能将它们输入到Matlab中。

Matlab与C混合编程的方法研究与实现毕业论文

Matlab与C混合编程的方法研究与实现毕业论文

Matlab与C混合编程的方法研究与实现摘要:文章探讨了MATLAB与VC++的优缺点,介绍了VC++与Matlab混合编程的几种方法。

通过二者的结合,既有效地利用了MATLAB强大的数值计算能力和众多的函数,大大减少程序设计的工作量,又继承了VC++良好的程序界面,证明是一种很好的程序设计方法。

具体说明了如何应用Matlab引擎实现混合编程以及如何利用MATCOM进行MATLAB和VC++混合编程,并将两种方法用于数字图像处理。

关键词:MATLAB;VC++;MATCOM;引擎;混合编程;图像处理一、引言1、数字图像处理简介:图像技术由高到低分为三个层次:图像处理、图像分析和图像理解。

图像处理是比较底层的操作,它主要在图像像素级上进行处理,处理的数据量非常大。

数字图像处理最基本的目的就是改善图像,主要是按需要进行适当的变换突出某些有用的信息,去除或消弱无用的信息,如改变图像的对比度,去除噪声或强调边缘的处理等,其基本方法有:直方图修正、灰度变换、图像的频域特性、图像平滑、图像锐化等。

直方图是图像的重要统计特征,是表示数字图像中每一灰度级与该灰度级出现的频率数间的统计关系。

直方图能给出该图像的大致描述,如灰度范围、灰度级的分布、整幅图像的平均亮度等,但它不能完整地描述一幅图像。

通常用横坐标表示灰度级,纵坐标表示频数。

通常一幅均匀量化的自然图像由于其灰度直方图分布集中在较窄的低值灰度区间,引起图像的细节看不清楚,为使图像变得清晰,我们可以通过变换使图像的灰度范围拉开或使灰度分布在动态范围内趋于均匀化,从而增加反差,使图像的细节清晰,达到图像增强的目的。

灰度变换是图像增强的一种重要手段,它可以使图像动态范围加大,使图像对比度扩展,图像更加清晰,特征更加明显。

灰度变换可分为线性、分段线性、非线性以及其他的灰度变换。

线性灰度变换实际上使曝光不充分的图像中黑的部分更黑,白的部分更白,从而提高对比度。

图像中的边缘或者线条部分与图像频谱中的高频成分相对应,因此采用高通滤波的方法让高频分量顺利通过,使低频分量受到抑制,就可以增强高频的成分,使图像的边缘或者线条变得清晰,实现图像的锐化。

Visual-C#与Matlab混合编程示例(含代码)

Visual-C#与Matlab混合编程示例(含代码)

Visual C# 与Matlab 混合编程由于Visual C# 与Matlab 混合编程的资料并不多,本文通过一个实例来阐述Visual C# 与Matlab 混合编程的方法。

一、混合编程的 4 种方式1. 通过从Matlab的*m文件中生成C语言版本的DLL1) 在Matlab中写好m文件;2) 使用Matlab的编译器,编译为C#能识别的DLL文件;3) 建立C#工程,在工程中引用上一步生成的文件;2. C#调用Matlab工作区计算并返回结果主要使用engOpen, engClose, engPutVariable, engEvalString, engGetVariable 函数进行操作。

大致过程如下:MatlabCSharp.engPutVariable(ep, "ml_a", mx_a);MatlabCSharp.engPutVariable(ep, "ml_b", mx_b);MatlabCSharp.engEvalString( ep, "ml_c = ml_a + ml_b ;" ); mx_c = MatlabCSharp.engGetVariable(ep, "ml_c" );3. 使用Matlab DeployTool 生成COM 组件1) 单击菜单New Deployment Project -> MATLAB Builder NE -> Generic COM Component2) 添加相应的M 文件3) 保存,编译4) 新建C#工程,引用生成的DLL文件。

4. 使用Matlab DeployTool 生成.Net 组件1) 单击菜单New Deployment Project -> MATLAB Builder NE -> .Net Component2) 添加相应的M 文件3) 保存,编译4) 新建C# 工程,引用生成的DLL 文件。

MATLAB与VC混合编程的实现

MATLAB与VC混合编程的实现

" ,-. / -0 与 12; ; 混 合 编 程 的实现方案
经 过研 究与验 证 3 12环 境中 调 用 ,-. / -0 程序有如下几种实现方案 ! 使用 ,-. 编译器 4 4 P / -0的 QJ J 使 用 ,-. 将4 4 R 2 S,( ,H T U 1-* Q 源文件 翻译为 J 并编译为 4 或4 文件 4 I I代码 3 K V K W : : 按 照 ,-. 在 12 或 0 4 X 2 S, 的 语 法 3 2中 直接书写 ,-. / -0语句 4
,-. / -0与 12混合编程的实现
潘林峰 3谭立超
中南民族大学电子与信息工程学院 3 湖北 武汉 $ ( & # # % $ *
摘 要! 讨论了 ,-. 并介绍了各方 案 的 使 用 方 法 和 技 巧 3 提出了选择算法的依 / -0与 12之间接口的方案 3 据并进行了混合编程 3 提高了代码执行速度 4 文献标识码 ! -
图 8 应用程序调用 !"# $ "%引擎函数 & 8 "R : W R 1 I KR F L W F 0 5? 0 1 1 P W!"# $ "%I P W P I
* & H 实现调用的步骤 针 对 ,2 需完成 44 的集成开发环境 7 9 ( ; Q C 如下的工作 6 在调用 !"# 7 8 9 $ "%引擎的 2 B B文件中加 入 I &[头文件 & P W P I
收稿日期 ! ) # # & # & ) ’ 万方数据
[\SI [\T . A A : 7 > 6 A L 7 6 B K J > A B 6 K 7 添加 ! 6 L J : 8 W K M 6 : K 7 ! ] ] ] J ,-. / -0 K V > K B L 6 L J : 8 W K ! ] ] J ,-. / -0] K V > K B L 6 L J : 8 W K] J I I 以上是 ,-. 的 文件和 文件 4 4 / -0 4 ? W K M 添加 ! / 6 ^ B 9 B _ M 6 K : 7 ! ] ] ] J ,-. / -0 K V > K B L : 6 ^ ! ] ] ] J ,-. / -0 K V > K B L 6 L J : 8 W K 将 文件不做任何改动 加入 ( $ * M 4 3 6 : K L 9 QK J I I 项目 3 然后与该项目中的其它文件一起编译执行 4 输出结果 4 ( + *

C#matlab混合编程MWArray使用笔记

C#matlab混合编程MWArray使用笔记

C#matlab混合编程MWArray使用笔记C# matlab混合编程徐凯Email:*********************这几天突然想搞一搞以前没有搞定的MATLABC#混合编程,今天把原来编写的代码拿出来看看,然后结合网上一些正确的和一些错误的代码看看,最后详细参考了MATLAB的帮助文档,总算搞定了C#和MATLAB的混合编程。

当然也不是完全搞定,仅仅完成了很小的一部分。

总结一下,也就是熟悉MW Array 和.NET之间的数据类型转换。

下面就和大家分享一下吧。

查看MATLAB提供一个最简单的关于绘图函数的例子,我先实践了一下MATLAB中的代码,发现发现有问题,有点怀疑matlab帮助文档的代码有问题,虽然这种情况真的非常的少见,但是后来证明我的怀疑是正确的。

MATLAB原来C#的代码大概是这样的。

//二维数组,Y=X^2double[,] plotValue = new double[10, 2];for (int i = 0; i < 10; i++){plotValue[i, 0] = i;plotValue[i, 1] = i * i;}//实例化Calculater对象Calculater myCalculater = new Calculater();//调用drawgraph方法myCalculater.drawgraph((MWNumericArray)plotValue);C#的代码中说起来也非常简单,声明一个二维数组,使用for循环给每一个元素赋值,这个数组的第0列是X坐标的值,数组的第1列是Y坐标的值,两个坐标的关系是Y=X^2。

而MATLAB中m文件的函数如下:function drawgraph(coords)plot(coords(1,:), coords(2,:));MATLAB的代码的意思也很简单,以coords矩阵的第1行的所有列为X坐标,第2行的所有列为Y轴。

使用VC调用matlab_engine编程

使用VC调用matlab_engine编程

关于如何使用VC调用matlab engine编程刚开始学使用VC调用matlab engine编程的时候,遇到很多问题,就去百度找解决方法,但发现根本解决不了我的问题,因为网上大部分实例和步骤都是在matlab6.5和vc++6.0环境下完成的,但是现在我用的是matlab2010a,所以会出现很多环境配置的问题,写本文的目的是总结用我在用VC调用matlab engine编程过程中出现的问题和解决办法。

Matlab Engine 采用Client/Server的方式,通过ActivcX通道和Matlab接口来实现在VC编程环境中直接调用matlab中的指令。

调用使用的函数是:engEvalSting。

下面是自己的实践过程:如果是第一次使用,则要设置一下Visual C++6.0 编程环境中的include 和lib的路径指向。

我的matlab2010安装在D盘目录D:\MATLAB 2010一、设置VC相关属性。

(1)Visual C++6.0 编译环境的设置:通过菜单 Tools/ Options,打开Visual C++6.0设置属性页,进入 Directorie页面,在 Show Directories for 下拉列表中选择Include Files,添加路径:D:\MATLAB 2010\extern\include (这是我电脑中Matlab的安装路径);再选择下拉列表中的 Library Files,添加路径:D:\MATLAB 2010\extern\lib\win32\microsoft(我电脑中Matlab 的安装路径,但是在我查看资料的时候看到很多是D:\MATLAB2010\extern\lib\win32\microsoft\msvc60这个路径,但是我用的是MatlabR2010a,msvc60是matlab6.5老版本才有的,10.0版本没有这个文件,所以我们把路径设到D:\MATLAB 2010\extern\lib\win32\microsoft 就可以了)。

MATLAB与VC混合编程配置设置

MATLAB与VC混合编程配置设置

MATLAB与VC混合编程相关配置的设置MATLAB与VC的混合编程中,需要对电脑的“环境变量”和VC的“环境配置”进行设置,然后才可以进行程序的调用。

(1)电脑中“环境变量”的设置:对于win10系统控制面板→系统→高级系统设置→环境变量→系统变量→path中添加D:\softwares\MATLAB\ bin\win64,该路径是MATLAB中dll文件的路径,在path 中添加该路径的目的是让VC在运营时能够读取dll文件。

否则VC在运行时可能会出现“计算机丢失**.dll文件”的情况。

对于win7系统的“环境变量”设置,同样是在path中进行的。

(2)VC的环境配置首先需要建立一个新项目,如MyAdd.cpp。

项目→MyAdd属性→VC++目录→包含目录→D:\softwares\MATLAB \extern\include;项目→MyAdd属性→VC++目录→库目录→D:\softwares\MATLAB\installation document\extern\lib\win64\microsoft。

C/C++→常规→附加包含目录→D:\softwares\MATLAB \extern\include;C/C++→常规→调试信息格式→程序数据库(/Zi);链接器→常规→启用增量链接→是(/INCREMENTAL);链接器→常规→附加库目录→D:\softwares\MATLAB\ extern\lib\win64\microsoft;链接器→输入→附加依赖项→libMyAdd.lib,mclmcrrt.lib,libmx.lib,libmat.lib,mclmcr.lib。

其中在输入时这些lib之间用回车换行。

上述步骤的工作界面如下所示:需要注意:在进行VC与MATLAB混合编程的过程中,用到的环境是32位还是64位,在这里需要是相同的编程环境才可以相互调用,如:上图中如果是x32,则需要点击“配置管理器”进行重新设置。

Matlab与VC(MFC)混合编程(介绍Matcom与Matlab 引擎两种方式)文库

Matlab与VC(MFC)混合编程(介绍Matcom与Matlab 引擎两种方式)文库

本文由wolf1sky贡献doc文档可能在WAP端浏览体验不佳。

建议您优先选择TXT,或下载源文件到本机查看。

Matlab 与 VC 混合编程 1:一、采用 Matcom1、目标1. 测试在 VC 中调用 MatrixC++库,生成矩阵并显示 2. 测试 VC 中调用.m 文件2、步骤2.1 目标 1<1>建立 VC 工程,添加库 v4501v.lib,有两种方法:?向工程中添加文件 v4501v.lib 在 Setting/link 中添加库 v4501v.lib(这样写的前题是 VC 路径设置正确,即在 Options/Directories 中设置,否则请注明详细路径)二者选其一就可以了。

<2> 添加头文件 #include "matlib.h" (这样写的前题是 VC 路径设置正确,即在 Options/Directories 中设置,否则请注明详细路径)建议:最好在工程中把文件 matlib.h 添加进来,方便查看函数详细说明 <3>现在就可以调用 Matrix中的C++函数了,例子如下:// Init matcom initM(MATCOM_VERSION); winaxes(AfxGetMainWnd()->GetSafeHwnd()); Mm a,b; a = (BR(1),2,3,semi,4,5,6,semi,7,8,9); a = transpose(a); b = (BR(1),2,3,semi,4,5,6,semi,7,8,9); m_1.Format("%3f %3f %3f \r\n%3f %3f %3f \r\n%3f %3f %3f \r\n",a.r(1,1),a.r(1,2),a.r(1,3),a.r(2,1),a.r(2,2),a.r(2,3),a.r(3,1),a.r(3,2),a. r(3,3));//m_1 是一个 CEdit 控件 UpdateData(FALSE); exitM();2.2 目标 2<1>首先用 Matlab 调试成功以下两个有依赖关系的.m 文件文件 1:equation.m function y = equation(a,b) y = a * b; 文件 2:CallE.m % function name function [o1,o2] = CallE(x) if (nargin ~= 1) error('arguments must be inputed!'); endif (x == 1) a = reshape(1:9,3,3); elseif (x == 2) a = reshape(11:19,3,3); else error('input error'); end b = magic(3); o1 = equation(a,b); o2 = o1 + 1; <2>将以上两个文件放在同一个目录下,启动 MatCom 编译运行 CallE.m, >> CallE(2) 则在同一目录下生成一个 DEBUG(或者是 Release,在 MatCom 的菜单项 Configuration 中选择)目录下可以找到相应的.cpp 及.h 文件,把它们全部拷贝到 VC 工程目录下,也可以自己建一个文件夹 <3>在 VC 项目中添加这些文件,并在头部添加相应.h 的引用,如下: #include "./matlib/equation.h" #include "./matlib/calle.h" <4>添加调用函数的代码,如下: Mm a,b,c; a = BR(2); 表示输入参数到输出参数的间隔,《MatrixLIB user's 详见calle(a,i_o,b,c); //i_o 是一个间隔符,Guide》m_2.Format("%3f %3f %3f \r\n%3f %3f %3f \r\n%3f \r\n",b.r(1,1),b.r(1,2),b.r(1,3),b.r(2,1),b.r(2,2),b.r(2,3),b.r(3,1),b.r(3,2),b. r(3,3)); %3f %3fUpdateData(FALSE);3、遇到的问题及解决方案<1>当在 VC 工程中添加由 Matcom 转换的 cpp 及 h 文件后,注:如果在编译中出现下列错误:fatal error C1010: unexpected end of file while looking for precompiled headerdirective 解决:进行下列设置:工程->设置-> C/C++ 选择 precompiled headers 选解决:择第一或第二项:自动选择预补偿页眉,如图:<2>使用Matcom 后,生成Debug 版没问题,而生成Release 时链接出错,nafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMT.lib(delete.obj) 解决:解决:将"Project 属性" -> "C/C++" -> "代码生成(codegeneration)" -> "运行时库(run-time library)" 项下修改应用程序的默认标准库版本,我修改成 Debug Multithreads 就可以了,原因是安装Matcom 时库为调试版<3>在其它机器上运行出错解决:解决:将 ago4501.dll v4501v.dll glu32.dll opengl32.dll 附带发布即可 <4>关闭程序后进程没有退出解决:解决:添加语句winaxes(m_hWnd);参考文献1、何东健等.《数字图像处理》.西安电子科技大学出版社.20032、邓科.浅析 VC 与matlab 接口编程(一). VC 知识库,41 期3、邓科.浅析 VC 与 matlab 接口编程(二). VC 知识库,42 期4、Matcom 参考手册Matlab 与 VC 混合编程 2:二、通过 Matlab 引擎与 VC 混合编程--飞狼编程宝典--明明知道选择你是一个错误,却为何那么地坚持这个错误……基于 Matlab 引擎的混合编程方式无法脱离 Matlab 环境,却为何还要使用它?根据本人的实践,对于一般应用,如矩阵运算,图像操作等,使用 Matcom 就已经足够,而且能够脱离 Matlab 那个巨大的环境而独立运行,但是,对于很多好用的 Matlab 工具箱,我们却无法直接在 VC 中调用。

在C++中调用Matlab

在C++中调用Matlab
5)将Matlab中的运行结果回传给C、C++
二、程序实现
我们通过一个简单的程序demo.c来说明C、C++对Matlab的调用。
#include
#include
#include
#include
/*在头文件中加入engine.h。其包含了调用的Matlab函数声明。*/
#include "engine.h"
在c,c++中调用Matlab
在பைடு நூலகம்,c++中调用Matlab
在C、C++中调用Matlab
Matlab是美国MathWorks公司的产品,是一种以矩阵为基本编程单位的高效数值计算语言。Matlab集科学计算、图像处理、声音处理于一体,为用户提供了丰富的Windows图形界面设计方法,使用户能够在利用其强大数值计算功能的同时设计出友好的图形界面
engClose(ep);
mxDestroyArray(a_ptr);
return(0);
}
当然,该程序在编译之前还需设置一些环境参数。在不同的开发环境中,其设置方法略有差异,我们以Borland C++ builder开发平台为例加以说明。
1)首先必须完成Matlab中链接库的导入工作。在Matlab\extern\include中存在_libmx.def、_libmat.def、_libeng.def等定义文件,在DOS环境中对它们执行命令:
另一种方式是选择将一个自定义的数据结构复制到mxArray中,值得注意的是Matlab在存储矩阵时是按列序保存的,而在C、C++中是按行序保存的,所以转换时注意分清下标。
3)调用engPutArray函数将矩阵放入到Matlab工作区中。

C++如何调用matlab函数

C++如何调用matlab函数

C++如何调用matlab函数
C++如何调用matlab函数
C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的.基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。

C++如何调用matlab 函数?下面就一起来了解看看吧!
本来电脑上安装的是matlab2012b,但是好像2012b只有64位的,故重新安装matlab7,安装完注册一下,cmd cd到matlab7的程序目录bin文件夹下,注册 matlab /regserver,就可以调用matlab了,先测试第一种方法,调用引擎,engOpen、engSetVisible、engClose
engEvalString(m_pEngine, "x1 = 0.01 : 0.01 : 10 * pi");
engEvalString(m_pEngine, "x2 = -10 * pi : 0.01 : -0.01");
engEvalString(m_pEngine, "y1 = sin(x1)./x1");
engEvalString(m_pEngine, "y2 = sin(x2)./x2");
engEvalString(m_pEngine, "plot([x2 x1], [y2 y1])");
在台式机上可以运行,但是到了笔记本上engOpen返回false,经过研究发现有可能是管理员权限的问题,
项目右键-属性-链接器-清单文件-uac执行级别选择requireAdministrator,重新编译运行果然正确了,先记录下来。

【C++如何调用matlab函数】。

VC++中如何能调用matlab函数

VC++中如何能调用matlab函数

Visual C++是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快。

但在科学计算方面函数库显得不够丰富、读取、显示数据图形不方便。

Matlab是一款将数值分析、矩阵计算、信号处理和图形显示结合在一起,包含大量高度集成的函数可供调用,适合科学研究、工程设计等众多学科领域使用的一种简洁、高效的编程工具。

不过由于Matlab使用的是解释性语言,大大限制了它的执行速度和应用场合。

基于VC和Matlab混合编程是很多熟悉VC++编程而又需要进行科学计算、数据仿真的科研人员常用的一种方式,其中最简单也最直接的方法就是调用Matlab引擎。

本文以下部分将详细介绍通过VC++6.0调用Matlab6.5引擎来达到VC++与Matlab数据共享编程的方法。

1. 什么是Matlab引擎所谓Matlab引擎(engine),是指一组Matlab提供的接口函数,支持C/C++、Fortran等语言,通过这些接口函数,用户可以在其它编程环境中实现对Matlab 的控制。

可以主要功能有:★打开/关闭一个Matlab对话;★向Matlab环境发送命令字符串;★从Matlab环境中读取数据;★向Matlab环境中写入数据。

与其它各种接口相比,引擎所提供的Matlab功能支持是最全面的。

通过引擎方式,应用程序会打开一个新的Matlab进程,可以控制它完成任何计算和绘图操作。

对所有的数据结构提供100%的支持。

同时,引擎方式打开的Matlab进程会在任务栏显示自己的图标,打开该窗口,可以观察主程序通过engine方式控制Matlab运行的流程,并可在其中输入任何Matlab命令。

实际上,通过引擎方式建立的对话,是将Matlab以ActiveX控件方式启动的。

在Matlab初次安装时,会自动执行一次:matlab /regserver将自己在系统的控件库中注册。

如果因为特殊原因,无法打开Matlab引擎,可以在Dos命令提示符后执行上述命令,重新注册。

c_调用matlab函数(混合编程)

c_调用matlab函数(混合编程)

第2部分实战练习(自己做的)2.1 c#调用matlab函数matlab版本2009b,c#版本vs2008.2.1.1 matlab函数编译成dll文件(1)首先编写一个函数的m文件,如MatrixOpera表示两个矩阵相加和相减。

%--------------------------------------------------------function [addRlt,minusRlt]=MatrixOpera(a,b)% 矩阵相加,相减[m1,n1]=size(a);[m2,n2]=size(b);if m1~=m2 || n1~=n2display('矩阵大小不相同')error('参数错误');endaddRlt=a+b;minusRlt=a-b;end%-----------------------------------------------------------两个输入参数,两个输出参数,并且都是矩阵形式(2)在matlab 命令窗口输入deploytool,弹出如下窗口或者点击matlab的主菜单desktop→deploy tool获得如下面图所示的窗口,然后在file→new→deployment project 中点击。

获得上图窗口,修改工程名称和文件后缀名(必须是,.Net Assembly格式)修改(3)新建了一个叫matPrj的工程(它相当于c#中的命名空间namespace);然后给它增加class或类(它就是c#中的类),点[add class]比如myMathClass;之后再给它添加方法(它就是函数了),点[add files],如下图所示。

本实例中给它添加了MatrixOpera等函数。

class方法(4)完了之后就可以编译了。

编译出来后需要一两分钟的时间。

编译(5)找到该工程存放的文件夹,从里面拷出matPrj.dll文件。

手把手教你用C#调用MATLAB函数

手把手教你用C#调用MATLAB函数

】【【转载】手把手教你用C#调用MATLAB函数编译环境:Microsoft Visual Studio2008版本9.0.21022.8RTM Framework版本 3.5已安装的版本:ProfessionalMicrosoft Visual Basic200891986-031-5000002-60050Microsoft Visual Basic2008Microsoft Visual C#200891986-031-5000002-60050Microsoft Visual C#2008Microsoft Visual C++200891986-031-5000002-60050Microsoft Visual C++2008Microsoft Visual Studio2008Tools for Office91986-031-5000002-60050Microsoft Visual Studio2008Tools for OfficeMicrosoft Visual Web Developer200891986-031-5000002-60050Microsoft Visual Web Developer2008Crystal Reports AAJ6G-K0MSA4K-680002ZCrystal Reports Basic for Visual Studio2008Matlab2008b首先需要做的工作是matlab编译器的设置,设置方法为:在Command window中输入mbuild-setup 显示如下>>mbuild-setupPlease choose your compiler for building standalone MATLAB applications:,Would you like mbuild to locate installed compilers[y]/n?n%选择nSelect a compiler:[1]Lcc-win32C2.4.1[2]Microsoft Visual C++6.0[3]Microsoft Visual C++.NET2003[4]Microsoft Visual C++2005[5]Microsoft Visual C++2005Express Edition[6]Microsoft Visual C++2008[0]NoneCompiler:6%选择6,其他编译器可以选相应的选项,我没有验证过The default location for Microsoft Visual C++2008compilers is C:\Program Files\Microsoft Visual Studio9.0,but that directory does not exist on this machine.Use C:\Program Files\Microsoft Visual Studio9.0anyway[y]/n?n%选择nPlease enter the location of your compiler:[C:\Program Files\Microsoft Visual Studio9.0] D:\Program Files\Microsoft Visual Studio9.0%选择您自己的当前安装路径Please verify your choices:Compiler:Microsoft Visual C++2008Location:D:\Program Files\Microsoft Visual Studio9.0Are these correct[y]/n?y%看上述信息,如果正确选择y**************************************************************************** Warning:Applications/components generated using Microsoft Visual Studio2008require that the Microsoft Visual Studio2008run-timelibraries be available on the computer used for deployment.To redistribute your applications/components,be sure that thedeployment machine has these run-time libraries.**************************************************************************** Trying to update options file:C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R2008b\compopts.batFrom template: D:\PROGRA~1\MATLAB\R2008b\bin\win32\mbuildopts\msvc90compp.batDone... %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%至次编译器设置完成%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%在matlab的Command window中输入:>>deploytoolMatlab产生deployment tool配置窗口单击新建按钮,新建工程------>选择MATLAB Builder NE选项卡----->选择.NET Component 并添加工程名eaqual(测试用名,其实工程名称就是你导入C#后的命名空间名称,Matlab会在当前工作目录中新建文件夹文件夹名既为equal)---->点击ADD File按钮将你需要编译的MATLAB函数添加进当前工程,我这里导入的是D:\Program Files\MATLAB\R2008b\toolbox\aero\aero\angle2quat.m文件---->点击build.deployment tool output窗口输出以下信息:Build output(2009-03-2815:32:55).[url=matlab:mcc%20-F%20%27E:%5CMATLAB%5Ceaqual.prj%27]mcc-F 'E:\MATLAB\eaqual.prj'[/url]等待...................................有点久当输出以下信息时编译成功了Compiler version:4.9(R2008b)Warning:Duplicate directory name:E:\MATLAB.mcc-W 'dotnet:eaqual,Eaqual,0.0,private'-d'E:\MATLAB\eaqual\src'-T'link:lib'-v'class{Eaqual:\Program Files\MATLAB\R2008b\toolbox\aero\aero\angle2quat.m}'Warning:Name is nonexistent or not a directory:D:\Program Files\MATLAB\R2008b\toolbox\compiler\patch.Warning:Name is nonexistent or not a directory:D:\Program Files\MATLAB\R2008b\toolbox\compiler\patch.Processing D:\Program Files\MATLAB\R2008b\toolbox\aero\mcc.enc Processing D:\Program Files\MATLAB\R2008b\toolbox\matlab\mcc.enc Processing include files...2item(s)added. Processing directories installed with MCR...The file E:\MATLAB\eaqual\src\mccExcludedFiles.log contains a list of functions excluded from the CTF archive.2item(s)added.Generating MATLAB path for the compiled application... Created40path items.Begin validation of MEX files:Sat Mar2815:35:112009End validation of MEX files:Sat Mar2815:35:112009Warning:Name is nonexistent or not a directory:D:\Program Files\MATLAB\R2008b\toolbox\compiler\patch.Deleting0temporary MEX authorization files.Parsing file"D:\Program Files\MATLAB\R2008b\toolbox\aero\aero\angle2quat.m"(Referenced from:"Compiler Command Line").Parsing file"D:\Program Files\MATLAB\R2008b\toolbox\compiler\deploy\deployprint.m"(Referenced from:"Compiler Command Line").Parsing file"D:\Program Files\MATLAB\R2008b\toolbox\compiler\deploy\printdlg.m"(Referenced from:"Compiler Command Line").Generating file"E:\MATLAB\eaqual\src\Eaqual.cs".Generating file "E:\MATLAB\eaqual\src\EaqualNative.cs".Generating file "E:\MATLAB\eaqual\src\readme.txt".Generating file "E:\MATLAB\eaqual\src\dotnet_mcc_component_data.cs".Executing command: C:\WINDOWS\\Framework\v2.0.50727\csc.exe/nologo/optimize /doc:"E:\MATLAB\eaqual\src\eaqual.xml"/t:library/r:"D:\Program Files\MATLAB\R2008b\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll"/resource:"E:\MATLAB\eaqual\src\eaqual.ctf"/out:"E:\MATLAB\eaqual\src\eaqual.dll" "E:\MATLAB\eaqual\src\Eaqual.cs""E:\MATLAB\eaqual\src\dotnet_mcc_component_data.cs"Executing command: C:\WINDOWS\\Framework\v2.0.50727\csc.exe/nologo/optimize /doc:"E:\MATLAB\eaqual\src\eaqualNative.xml"/t:library/r:"D:\Program Files\MATLAB\R2008b\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll"/resource:"E:\MATLAB\eaqual\src\eaqual.ctf"/out:"E:\MATLAB\eaqual\src\eaqualNative.dll""E:\MATLAB\eaqual\src\EaqualNative.cs" "E:\MATLAB\eaqual\src\dotnet_mcc_component_data.cs"Copying:E:\MATLAB\eaqual\src\eaqual.dll->E:\MATLAB\eaqual\distribCopying:E:\MATLAB\eaqual\src\eaqualNative.dll->E:\MATLAB\eaqual\distrib Copying:E:\MATLAB\eaqual\src\readme.txt->E:\MATLAB\eaqual\distribCompilation completed succesfully.The output is located in E:\MATLAB\eaqual\distrib.You can package the component by clicking on the"ackage"icon in the Deployment Tooltoolbar,or by clicking the Tools->ackage menu when the Deployment Tool panel is selected.To include additional files in the package,click Project->Settings).生成的文件在工程文件夹里面我的是E:\MATLAB\eaqual\distrib\angle2quat.dll至此MATLAB的操作全部完成打开VISUAL Studio2008新建C#工程我这里用的是控制台名为TestOfmatlab_consolt我的是E:\Visual Studio2008\Projects\TEST\TestOfmatlab_consolt添加引用E:\MATLAB\eaqual\distrib\angle2quat.dll和D:\Program Files\MATLAB\R2008b\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll(这里我没有用MATLAB画图,所以只引用MWArray.dll)加入命名空间:using .Arrays;将下面代码加入Main函数eaqual.Eaqual eq=new eaqual.Eaqual();.Arrays.MWArray m=10,n=4,j=7,k;MWArray S="XYZ";k=eq.angle2quat((MWNumericArray)m,(MWNumericArray)n, (MWNumericArray)j,(MWCharArray)S);MWNumericArray temp=(MWNumericArray)k;double[,]location=(double[,])temp.ToArray(MWArrayComponent.Real);Console.WriteLine(location[0,0].ToString());Console.WriteLine(location[0,1].ToString());Console.WriteLine(k[2].ToString());Console.WriteLine(k[3].ToString());Console.WriteLine(k[4].ToString());Console.ReadLine();编译运行即可看到输出,此函数是姿态角转四元数函数,具体功能就不做说明了。

实现VC++MATLAB混合编程论文

实现VC++MATLAB混合编程论文

浅谈实现VC++与MATLAB混合编程摘要:本文深入分析了vc++与matlab两种编程语言的特点,充分发挥了两种语言的优点,实现混合编程。

并在弹箭弹道参数相对于气动参数的灵敏度分析过程中进行了验证,直观方便地利用灵敏度函数对气动参数加以辨识,得出弹道参数模型,并进行弹道计算。

关键词:编程混合编程灵敏度matlab是一种以矩阵为基本运算单位的高效数值计算软件,带有功能强大的数学函数库,并开发有多种学科领域的工具箱函数库,广泛地应用于科学研究与工程计算。

vc++用于面向对象的可视化编程,可以完成从底层软件直到面向用户软件等各种应用程序的开发。

利用它提供的各种实用工具,开发者可以轻松开发出高效强大的windows应用程序。

把matlab在数值计算、算法设计以及数据可视化等领域的优势与vc++应用系统集成,不仅可以完全满足系统在数据运算与表现方面的需求,而且还可提高系统处理的效率和稳定性,同时也减少了开发人员实现算法的困难,缩短了软件开发的周期,提高了软件质量,在实践中具有很高的使用价值。

1 mlrs/m26多管火箭弹弹道所谓弹道是指弹箭在空中飞行时,其质心所经过的路线,它是一条空间曲线。

从弹箭侧面看,弹道的投影如图1所示:利用现代控制理论、弹箭飞行动力学、数值分析、随机过程、弹箭设计理论以及计算机仿真等理论,分析弹箭弹道参数对气动系统灵敏度函数问题,以matlab和vc为操作平台,制作用户操作界面。

2 vc++与matlab混合编程的优点vc++用于面向对象的可视化编程,开发者可以轻松开发出高效强大的windows应用程序,利用它提供的各种实用工具,可以完成从底层软件直到面向用户软件等各种应用程序的开发。

但在实际工程开发中,与matlab相比:①matlab比vc++在数值处理分析和算法工具等方面更优异。

②matlab比vc++在准确方便地绘制数据图形方面更完善。

matlab具有强大的数值计算功能,matlab中提供了大量用c\c++重新编写的matlab库函数,matlab自身存在一些缺点限制了它在更多方面的应用,主要包括初等数学函数、线形代数函数、矩阵操作函数、数值计算函数、特殊数学函数、插值函数等,这些缺点主要包括:①容易被直接读取,所以难以保护劳动者的成果,matlab编写的m文件大多是文本文件。

基于COM技术的C_与Matlab混合编程

基于COM技术的C_与Matlab混合编程

—87—基于COM 技术的C#与Matlab 混合编程姚光强,陈立平(国家农业信息化工程技术研究中心,北京 100097)摘 要:提出基于组件对象模型(COM)技术实现Visual C#与Matlab 混合编程的2种方法,一种是通过C#使用Matlab 提供的自动化服务,另一种是使用Matlab COM Builder 将M 语言文件编译成COM 组件供C#调用。

以地理信息系统中常用的空间插值分析为例给出了这2种方法的具体实现。

对两者进行比较,提出了各自的适用范围。

结果表明使用COM 技术实现混合编程能充分发挥Visual C#与Matlab 各自的特点,提高程序开发和运行效率。

关键词:Visual C#语言;Matlab 软件;混合编程;组件对象模型Integrated Programming Between C# and Matlab Based onComponent Object ModelYAO Guang-qiang, CHEN Li-ping(National Engineering Research Center for Information Technology in Agriculture, Beijing 100097)【Abstract 】Two approaches of integrated programming based on Component Object Model(COM) are introduced. One utilizes the automation server provided by Matlab. The other compiles the Matlab program written in M scripting language to component by using Matlab COM builder,then invoking it in Visual C#. The usual spatial interpolation algorithm in GIS is implemented by these two approaches. The advantages and defects of them are discussed, and the adaptive application range is suggested. The result is that the COM based methods for integration, which make full use of the two platforms, can speed up software development and improve its performance. 【Key words 】Visual C#; Matlab; integrated programming; Component Object Model(COM)计 算 机 工 程Computer Engineering 第34卷 第14期Vol.34 No.14 2008年7月July 2008·软件技术与数据库· 文章编号:1000—3428(2008)14—0087—03文献标识码:A中图分类号:TP3111 概述Matlab 是一种专门以矩阵形式处理数据的科学计算软件,广泛地应用于数值分析、控制系统、图像处理、数字信号处理等领域的分析、仿真和设计。

matlab与C混合编程步骤详解

matlab与C混合编程步骤详解

1MATLAB Compiler 是MATLAB自带的一个编译器,它能将m文件转化成 C、C++或p等各种类型的源代码,并根据需要生成可执行文件、lib文件(库文件)、dll文件或S函数文件等。

Matlab所使用的编译器包括了MATLAB 的C\C++数学库函数以及图形库。

必须保证编译器的正确配置,因为编译器使用了C\C++库函数,所以在使用前需要使用mex -setup 和 mbuild -setup两个命令对编译器进行配置。

步骤如下:1. 设置Matlab的编译器,使用外部的VC或者gcc等编译器。

2. 编译m文件成dll3. 设置VC等的继承环境,设置C需要用到的静态库和动态库4. 编写C调用dll1.1设置MATLAB编译器首先要安装Matlab 编译器,一般来说,在安装了Matlab后编译器就己经安装了,所在就只需要对Matlab编译器进行设置。

1.1.1 编译环境设置首先设置系统的环境变量,点击“我的电脑”属性-→系统特性--→高级-→环境变量-→添加系统变量Matlab值为Matlab的安装路径:G:\matlab7.0\bin\win32,重启电脑即可。

1.1.2 MATLAB7.0 编译器设置(a) 为编译后产生的MEX文件进行预配置在Matlab 的命令窗口(Command Window) 键入“mex -setup ”命令后,按回车键,安装Matlab 编译器;(b) 为产生独立外部应用程序进行预配置对Matlab编译器mbuild应用程序进行设置,运行Matlab ,在Matlab 的命令窗口(Command Window) 键入“mbuild -setup ”命令后,按回车键,安装Matlab 编译器;1.2 将MATLAB函数转成DLL函数在Matlab的Command Window /下输入命令:命令 1 :mcc -W lib:dlltest -T link:lib huatu_test.m或命令 2 :mcc -W cpplib: dlltest -T link:lib huatu_test.m命令1生成的是C,命令2生产的是C++。

C#调用Matlab

C#调用Matlab

2、利用matlab自带的.nettool工具将.m文件转换成.net组件--->.dll文件为接口,它实际上不含任何实现,都是调用另一个.ctf文件来完成具体的功能。
3、在c#中,必须引入mwarray.dll才能拥有在.net中进行矩阵运算所需要的一切。虽然matlab help中只是说推荐,但一般的应用中,只是进行一部分函数的调用,而不是去取得整个运行结果。这个.dll是必须引入的。有时mclmcrrt74.dll这个文件也需要引入。根据具体的要求,需要引入的文件也有所差别。
ResOut=GTN.GetMatchNo(1,MainAdd, ModelAdd, FName.GTM(), Vaval);
MWNumericArray temp = (MWNumericArray)ResOut[0];
//矩阵转换
Array netInterfaceMatrix = temp.ToArray(MWArrayComponent.Real); //c#规范的矩阵
[/redtramp/blog/item/785997264e4d27148b82a1c1.html]
kevin 评论于 2007-11-20 11:34 回复 引用 查看
#2楼 [楼主]
Matlab统计工具箱简介
/space/html/68/t-53768.html
发表于 2007-11-20 11:07 kevin 阅读(1449) 评论(7) 编辑 收藏 所属分类: 技术及文章推介 、软件技术小文
评论
#1楼 [楼主]
补充:
2.c#.net下实现调用
打开或新建一个c#项目(我采用的是编辑器),选中右边的解决方案资源管理器中的引用,点鼠标右键,选添加引用,在弹出来的窗口中选com,然后也找到comtest_1_0.dll,点选择,然后确定就可,此时此com组件也添加到工程里面去了,同样我们可以选择对象浏览器来看comtest及下面的sgltest类,c#测试项目如下:

Matlab与C#混合编程

Matlab与C#混合编程

Matlab与C#混合编程的实现关于matlab与c#之间一些数据类型的转换的方法,我也曾经写过。

总结一下,最主要的是要完成下面几个步骤:1、同时安装.netframwork与MCR(matlab compile runtime)。

这个在装完 与matlab以后,前面2个组件也就安装好了。

2、利用matlab自带的.nettool工具将.m文件转换成.net组件--->.dll文件为接口,它实际上不含任何实现,都是调用另一个.ctf文件来完成具体的功能。

3、在c#中,必须引入mwarray.dll才能拥有在.net中进行矩阵运算所需要的一切。

虽然matlab help中只是说推荐,但一般的应用中,只是进行一部分函数的调用,而不是去取得整个运行结果。

这个.dll是必须引入的。

有时mclmcrrt74.dll这个文件也需要引入。

根据具体的要求,需要引入的文件也有所差别。

4、生成一个实例,并对.net组件所输出的结果进行数据类型的转换,以符合.net 编程环境中对数据类型的要求,这个在以前我已经讲过,这里就不再多说了。

关键是掌握如何把一个矩阵(在matlab中,一个m*n的矩阵对应.net中的一个1*(m*n)的数组)转换成数据类型一致的数组。

目前所有的matlab数据类型(无论什么类型,都可以把它看成一个矩阵,这样就可以利用数组的思想来思考)都可以进行转化,具体的可能需要经过实验才能符合各自的要求。

虽然matab对.net的支持不如它对c++支持的功能强大,但也已经满足了我们实际应用的需求。

如果我们可以把大部分的运算都放在matlab里面完成,数据转换的数量又少,那么整个系统的运行速度与效率还是挺高的。

c#与matlab混合编程图解using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;namespace ConsoleApplication1{class Program{static void Main(string[] args){Program p = new Program();p.MatlabTest();Console.WriteLine("按任意键退出...");Console.ReadKey();}/// <summary>/// 测试C# matlab调用/// </summary>private void MatlabTest(){Console.WriteLine("正在载入matlab for .NET库......"); DotNetTest.DotNetTestclass dt = newDotNetTest.DotNetTestclass();Console.WriteLine("完成......");Console.WriteLine("-----------------------------------------------");// 多项式int demention = 3;double[] dd = new double[demention];dd[0] = 1;dd[1] = 4;dd[2] = 6;//.Arrays.MWArray d =// .Arrays.MWNumericArray.MakeSpar se(// 1, demention,.Arrays.MWArrayComplexity.Real, demention);.Arrays.MWNumericArray d = (.Arrays.MWNumericArray)dd;Console.WriteLine("开始计算多项式:[{0}] ......",d.ToString());// 存储计算结果.Arrays.MWArray h;// 调用matlab函数计算h = dt.myroots(d);// 取得实部Array real =((.Arrays.MWNumericArray)h).ToArray(MathWorks.MAT .Arrays.MWArrayComponent.Real);string realpart = "实部列表:";foreach (double i in real){realpart += i + "\t";}// 取得虚部Array imaginary =((.Arrays.MWNumericArray)h).ToArray(MathWorks.MAT .Arrays.MWArrayComponent.Imaginary);string imaginarypart = "虚部列表:";foreach (double i in imaginary){imaginarypart += i + "\t";}Console.WriteLine(realpart);Console.WriteLine(imaginarypart);// 打印结果Console.WriteLine("计算结果:");Console.WriteLine(h.ToString());}}}C#与Matlab混合编程的几种方式1. 通过从Matlab的*.m文件中生成C语言版本的DLL具体过程:1) 在Matlab中写好一个m文件(比如一个简单的加法函数myplus.m);2) 使用Matlab的mbuild -setup选择编译器,我机器上的编译器有两个LCC 和VC2008(注意如果使用做应用的话,建议编译器选VC2008,否则C#中会告诉你DLL找不到Entry Point)3) 在命令行中使用mcc -B csharedlib:mypluslib myplus.m (如果是多个M文件,接着往后写),等待几十秒之后会生成若干文件(*.c, *.h, *.dll等), 其中.h文件中有导出的函数原型。

VC调用matlab的linprog函数-----自己的总结

VC调用matlab的linprog函数-----自己的总结

VC调用matlab的linprog函数-----自己的总结1.编写m文件function [X,f]=lin(f,A,b)[x,fval] = linprog(f,A,b);X=x;f=fval;End保存为lin.m2.将m文件编译为dllmcc -W cpplib:liblin -T link:lib lin.m -v其中,libname为编译后的库文件名,lin.m为matlab的m文件名该命令用于mwArray数据类型生成四个文件(用到的):liblin.ctf liblin.dll liblin.h liblin.lib3.VC++6.0工程的创建与设置(1)建立一个名为Test的C++控制台工程,在工程中添加一个名为test.cpp文件(2)对VC++6.0的设置(与matlab关联,一旦设置后以后就不需再修改)----工具--->选项---->目录----->include files: 加入--e:\matlab7\extern\inlcude------>Library files:加入--e:\matlab7\exterm\lib\win32\microsoft\msvc60(3)针对该工程的设置:工程---->设置----->连接---->对象/库模块:加入mclmcrrt.libliblin.lib(自己制作dll时生成的库文件)注:也可以不在这里设置,在test.cpp文件中加入:#pragma comment(lib,"mclmcr.lib")#pragma comment(lib,"liblin.lib")(4)将前面生成的四个文件(matlab的works文件夹下)添加到VC6.0建立的工程目录下,将liblin.h添加到工程(工程--->添加到工程---->文件)例: min f = -4x1- x2,s.t. -x1+2x2<=42x1+3x2<=12x1-x2<=3x1,x2>=0(1)在matlab中计算:>> f = [-4;-1];>>A = [-1 2; 2 3; 1 -1];>>b = [4;12;3];>>[x,fval] = linprog(f,A,b)(2)在VC中调用dll具体代码:#include <iostream>using namespace std;#include "mclmcr.h"//mwArray类型定义#include "liblin.h"dll的头文件#pragma comment(lib,"mclmcr.lib")#pragma comment(lib,"liblin.lib")int main(){//初始化程序if(!mclInitializeApplication(NULL,0)){cout<<"Could not initialize the application!";exit(1);}//初始化库if(!liblinInitialize()){cout<<"Could not Initialize the library!";exit(1);}//输入参数f,A,bmwArray A(3,2,mxDOUBLE_CLASS);mwArray f(2,1,mxDOUBLE_CLASS);mwArray b(3,1,mxDOUBLE_CLASS);//输出参数X,fvalmwArray X(2,1,mxDOUBLE_CLASS);mwArray fval(1,1,mxDOUBLE_CLASS);//输入,传给mwArraydouble aa[]={-1,2,1,2,3,-1};//注意,这里的约束系数与在matlab中的不一样double bb[]={4,12,3};double ff[]={-4,-1};//给f,A,b赋值A.SetData(aa,6);b.SetData(bb,3);f.SetData(ff,2);//调用函数lin(2,X,fval,f,A,b);//从X,fval取值double* x;double* fv;x = new double[2];fv = new double[1];X.GetData(x,2);fval.GetData(fv,1);//输出结果cout<<"X = "<<x[0]<<" "<<x[1]<<endl; cout<<"fv = "<<fv[0]<<endl;//关闭库和程序liblinTerminate(); mclTerminateApplication();return 0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第2部分实战练习(自己做的)2.1 c#调用matlab函数matlab版本2009b,c#版本vs2008.2.1.1 matlab函数编译成dll文件(1)首先编写一个函数的m文件,如MatrixOpera表示两个矩阵相加和相减。

%--------------------------------------------------------function [addRlt,minusRlt]=MatrixOpera(a,b)% 矩阵相加,相减[m1,n1]=size(a);[m2,n2]=size(b);if m1~=m2 || n1~=n2display('矩阵大小不相同')error('参数错误');endaddRlt=a+b;minusRlt=a-b;end%-----------------------------------------------------------两个输入参数,两个输出参数,并且都是矩阵形式(2)在matlab 命令窗口输入deploytool,弹出如下窗口或者点击matlab的主菜单desktop→deploy tool获得如下面图所示的窗口,然后在file→new→deployment project 中点击。

获得上图窗口,修改工程名称和文件后缀名(必须是,.Net Assembly格式)修改(3)新建了一个叫matPrj的工程(它相当于c#中的命名空间namespace);然后给它增加class或类(它就是c#中的类),点[add class]比如myMathClass;之后再给它添加方法(它就是函数了),点[add files],如下图所示。

本实例中给它添加了MatrixOpera等函数。

class方法(4)完了之后就可以编译了。

编译出来后需要一两分钟的时间。

编译(5)找到该工程存放的文件夹,从里面拷出matPrj.dll文件。

同时还要从G:\Program Files\MATLAB\R2009b\toolbox\dotnetbuilder\bin\win32\v2.0拷贝出MWArray.dll和module。

第二个文件必须要哦,否则可能会出错。

2.1.2 c#添加matlab的dll引用(1)打开vs2008,新建一个窗体应用程序。

(2)将刚才拷贝到的那3个文件一起放在vs工程(CallMatlabDllApp)的debug文件夹下面。

然后右键下图中的引用,选择添加引用,弹出一个窗口,选择其中的浏览页面,分别添加matPrj.dll文件和MWArray.dll文件。

(3)最后在前面,代码的前面添加下面的命名空间即可。

using .Arrays;//在MWArray.dll,最常用的using .Utility;// 在MWArray.dll,最常用的using matPrj;//这个就是我们自己定义的,里面有matlab函数如果matlab函数复杂,还需要用到其他的空间,则视情况而定,自己凭经验添加。

已经添加了的引用至此,已经可以利用c#调用我们用matlab编写的函数了。

2.1.3 函数调用函数调用前必须注意:(1)将c#的参数输入到matlab函数时,要将参数转化为matlab的参数形式,通常是MWArray类型。

(2)matlab返回的参数,也要转化为c#用的类型,比如数组或者数值类型。

下面是关于(1)和(2)的介绍,从别人那拷过来的,具体可参考/share/detail/294982直接将值传递给已经初始化的MWArray数组中的成员直接将数据类型赋值给已经初始化的MWNumericArray变量。

直接将字符串类赋值给已经初始化的MWCharArray变量。

如果是数组类型:直接赋值给MWNumericArray变量;赋值给MWArray变量,则在前面加上类型转换如:(MWNumericArray)进行强制转换。

总之,MWArray是总类型,其它的以MW开头,以Array结尾的变量类型都可以直接对它进行赋值或取值。

M类型到C++/C#数据类型MWArrayM类型,它是M文件的编译后内部的标准类型,一切C++/C#类型都要最终转换成此类型,方可作为参数调用M语言函数。

MWCharArrayM的字符串类型,使用它可以将M中的字符类型转换成C++/C#的字符串类型。

MWNumericArrayMWNumericArray是MWArray与C#等语言的转换中间类型。

常用的转换函数:①public Array ToArray(MWArrayComponent component);将M类型转换成C#的Array类型,然后可以直接转换成其它类型的数组。

②public byte ToScalarByte();将M类型转换成C#的字节类型;③public double ToScalarDouble();将M类型转换成C#的双精度类型;double temp = ((MWNumericArray)(mwArgout[0])).ToScalarDouble();④public float ToScalarFloat();将M类型转换成C#的单精度类型;⑤public int ToScalarInteger();将M类型转换成C#的整型类型;⑥public long ToScalarLong();将M类型转换成C#的长整C/C++/C#数据型类型;⑦public short ToScalarShort();将M类型转换成C#的短整型类型;⑧public override string ToString();将M类型转换成C#的字符串类型;string arror = mwArgout[2].ToString();⑨public Array ToVector(MWArrayComponent component);将M类型转换成C#的Array类型,然后可以直接转换成其它类型的数组。

下面使用调试过的代码示例表述①⑨两个函数的区别:①double[,] Temp1 = new double[1,3];Temp1=(double[,])((MWNumericArray)mwArgout[1]).ToArray(MWArrayComponent.Real);⑨double[] s1 = new double[2];s1 = (double[])((MWNumericArray)mwArgout[1]).ToVector(MWArrayComponent.Real);(3)必须注意到多参数输入和多参数返回的问题。

刚开始碰到这个这个问题比较头疼,后来经过不懈的努力,终于从网上找到答案。

声明这部分是我参考别人的想法自己写的额,网上百度知道也有我(lwq123_321)回答的。

//输入这里想传入的2个输入参数,为了支持矩阵好通用,所以得弄成Array double[] a = { 1, 2, 3, 4, 5, 6 };//输入参数1double[] b = { 2, 4, 6, 8, 10, 12 };//输入参数2double[,] c = new double[3, 2];//输出参数1double[,] d = new double[3, 2];//输出参数2//这些参数都是矩阵MWNumericArray ma = new MWNumericArray(3, 2, a);//转换成matlab需求的格式MWNumericArray mb = new MWNumericArray(3, 2, b);//输出参数是一个MWArray数组MWArray[] agrsOut = new MWArray[2];//两个输出参数,一定要写数量//输出几个输出参数可以是不同类型的,比如第一个元素是矩阵,第二个是数值//同理,输入参数也是一个MWArray数组MWArray[] agrsIn = new MWArray[] { ma,mb};//调用函数,输出参数需要加ref 关键字myFun.MatrixOpera(2, ref agrsOut, agrsIn);//2表示输入参数的个数,输出结构都在argsOut中,类似于c的指针参数输入//转换得到实际的输出参数MWNumericArray x1 = agrsOut[0] as MWNumericArray;MWNumericArray x2 = agrsOut[1] as MWNumericArray;c = (double[,])x1.ToArray();d = (double[,])x2.ToArray();//一定要注意最后c和d的转化,不同类型的转换差异很大厄//ToArray()对应n*m的数组//ToScalarDouble()对应单个数值//ToVetor()对应1维数组到此,已经实现了c#调用matlab函数的整个过程。

第1部分他山之石可以攻玉(别人的经验收集)1.1 matlab与c#接口的实现/lemonfamily/article/details/1497527发现博客里上传图片特别的麻烦,以后可能就不再传什么图片上来了,都放到相册里实在浪费空间。

一直以来,各系统之间如何实现互相通信都是非常重要也是最难解决的问题,同时也是关系到一个系统设计成败的关键。

我们这里所说的接口,也就是系统与系统间交互的中间媒介或者说是数据转换器。

关于matlab与c#之间一些数据类型的转换的方法,我也曾经写过。

总结一下,最主要的是要完成下面几个步骤:1、同时安装.netframwork与MCR(matlab compile runtime)。

这个在装完 与matlab以后,前面2个组件也就安装好了。

2、利用matlab自带的.nettool工具将.m文件转换成.net组件--->.dll文件为接口,它实际上不含任何实现,都是调用另一个.ctf文件来完成具体的功能。

3、在c#中,必须引入mwarray.dll才能拥有在.net中进行矩阵运算所需要的一切。

虽然matlab help中只是说推荐,但一般的应用中,只是进行一部分函数的调用,而不是去取得整个运行结果。

这个.dll是必须引入的。

有时mclmcrrt74.dll 这个文件也需要引入。

根据具体的要求,需要引入的文件也有所差别。

4、生成一个实例,并对.net组件所输出的结果进行数据类型的转换,以符合.net编程环境中对数据类型的要求,这个在以前我已经讲过,这里就不再多说了。

关键是掌握如何把一个矩阵(在matlab中,一个m*n的矩阵对应.net中的一个1*(m*n)的数组)转换成数据类型一致的数组。

相关文档
最新文档