Matlab与C_混合编程

合集下载

VC和MATLAB混合编程方法在迷彩斑块设计中的应用

VC和MATLAB混合编程方法在迷彩斑块设计中的应用

i t .Th ma eP o esn ob xi ald B sn eI g r cs igTo lo c l yu igMATLAB fn t n nod rt raeC(M tra e.VC十 十 c l h s e u ci si r e oce t ) i efc s o n al t e s
i t ra e ,a l a r c s e h e u n n e u t tr a i h r c s ig o h n u a k r u d i g b an t e b u d n e f c s swel sp o e s st er t r i g r s l .I e l e t ep o e sn f e i p t c g o n z t b ma eo t i o n — h
关键词 MAT I AB; + + ;边缘 提取 ; O VC C M
T 3 1 5 P 1.6 中 图分 类 号
Ap lc to f VC n ATLAB n D e ni m o l g p t p ia in o a dM i s g ng Ca i ufa e S o s
白万 民 闰 飞 喻 钧
西 安 70 3 ) 1 0 2 ( 西安 工 业 大 学 计 算 机 科 学 与 工程 学 院


通过一个迷彩斑块设计 实例 , 阐述 VC和 MAT I AB的混合编程 方法在迷 彩设计 中的应用 。使用 MAT A L B
函数 调用 图像处理工具箱 , 创建 C OM 接 口, 从而实现 VC ++调用该 C M 接 口 , O 并对返 回结果进 行处理 。实现对输入的背 景图像进行处理 , 获得 图像 的边缘轮廓 , 为迷彩的斑块设计提供 依据 。既能充分利用成熟 的函数库加快软件开发 , 成功提取 到背景 的较闭合边缘 , 又能保证 良好的用户界面及性能 。

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是⼀个可执⾏的⼆进制⽂件。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 ( + *

MATLAB与VC混合编程及应用研究

MATLAB与VC混合编程及应用研究

Ab ta t Th s p p r i t o u e h a l g m e h d a d t e a p ia i n o h ATLAB a d V C c mb n d sr c : i a e n r d c s t e c l n t o n h p l t ft e M i c o n o i e
( . De a t e to n o ma in Teh oo y C a g h u Te tl r e tI siu e Ch n z o 1 1 4 1 p rm n fI f r to c n lg , h n z o x i Gam n n tt t , e a g h u2 3 6 ,
M ATL AB al g VC r g a : c l n h e ae u ci ns se (FS yVC f r a , d a n h f cln i p o rm al gt ei rt df n t y t m I )b o m t rwi gt ea— i t o fn r n f r ain o r ca n ep lt d f n t n ( F) g a h b s d O ATLAB ln u g . I fe s ie ta so m to ffa t litr oa e u ci o FI rp a e n M a g a e to fr
1 0 m x e de e m e f Ni gb ipo t hi hwa 0 e t n d s g nt o n o ar r g y,i o i r he c m bi d pr gr m mi e ho y t c nsde s t o ne o a ng m t d b
文章 编号 :l 7 — 9 2 ( 0 8 2 o 2 3 6 3 6 0 2 0 )O —0 4 一O

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,则需要点击“配置管理器”进行重新设置。

VC与Matlab混合编程的实现

VC与Matlab混合编程的实现
机/ 务 器 的计 算 模 式 .通 过 Wid w的 A t e 服 no ci X v M C U eMF naS a dD L f F :s C i h r L 系统 菜 单 e 通道 和 Ma a 进 行 连 接 。f) 用 M t b数 学 函 工 程 \ 置 \连 接 对 象 \ 模 块 添 加 l mal. tb l 2应 al a 设 库 i t b b
1 引 言 、
MA L ec p t %\xeni ld \p a n
V 60是 Wi o s 面下 计算 机 专 业 人 士 进 C. n w 界 d
行 软 件开 发 时 的一种 强 大工 具 .在 图形 用 户界 面 需要 说 明的是 ,如果 Ma a t b的版本 不 同 , l 这 开发 方 面有 优势 . 码效 率 高 . 而在 科 学计 算 方 里看 到 的路 径就 会有 差 别 . 如 Ma a 6 代 然 例 t b 5和 Ma— l t 面能 力却 略 显不 足 。例如 , 当我们 采 用 V C作 为 开 l 7 a 4的路 径就 会有 所 差别 b 发 工 具 解 决 图 像处 理 和 模 式 识别 领域 的 问题 时 . Se .注 意 %Malb e trk bw n 2 \ . tp 3 t %\xenl \ i3 mi a i 经常需 要 进行 一 些复 杂 的矩 阵计算 例 如计 算 矩 阵 c0o \ v6 r fmsc 0中 的 * i 件 与 你 需 要 调 用 的 函 st .b文 1
12 7
福 建 电

2 1 第 4期 0 2年
V C与 Ma a t b混合 编 程 的 实现 l
黄 红兵
( 建农 林 大 学计 算机 与信 息 学院 福 建 福 州 3 0 0 福 5 0 1)

MATLAB中调用VC混合编程方法的研究与实现

MATLAB中调用VC混合编程方法的研究与实现
c l VC f n t n n a MAT AB p o e u e w t h o i ro al u ci s i o L r c d r i t e c mp l fMAT AB b h t o f MEX, n r vd d a c n r t h e L y t e meh d o a d p o i e o c ee e a l fa ta h n s i a tto h tc n a h e e a t mai n e ig T e r s l r v h tt e meh d e e t l ov x mp e o e c ig a ss n o lt a a c iv u o t i d x n . h e u t p o e t a h t o f c i y s l e t c s v t e p o lm fa c r t o a in o h ep d c me tt n i h o t a e p o a h r b e o c u ae lc t ft e h l o u n a i n t e s f r r g mme y MAT AB l n a e a d p o ie o o w r db L a g g , n rv d u
何 利 用 M r A 自带 的 编 译 器 通 过 ME 方 法 实现 在 MA L B程 序 中调 用 V 函数 , 结 合 实 际 给 出 了一 个 在 辅 Ar B L X TA C 并 助 教 学软 件 中 实 现 自动 索 引 的具 体 例 子 。 运 行 结 果 证 明 该 方 法 能 够 有 效 解 决 基 于 MA I B语 言 开 发 的 软 件 中 帮 TA 助 文 档 精 确 定 位 的 问题 . 为 其 他 类 似 应 用 提 供 参 考 。 并

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函数(混合编程)

第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文件。

MATLAB和VC混合编程在数控加工路径优化中的应用

MATLAB和VC混合编程在数控加工路径优化中的应用

合编程开发数控软件周期短,软件运行效率高、易于维护、保密性强。 关键词 :贪心 一 遗传算法 ; 混合编程 ;动态链接库 ;M A T L A B ;V c + +; 路 径优 化 中图分类 号 :T P 3 1 文献标识码 :A 文章编 号 :1 0 0 9 - 0 1 3 4 ( 2 0 1 3 ) o 8 ( 下) -o o 5 1 -0 5
MAT CO M工具 将 m函数 文 件转 化成 相 同功 能 的C + + 文 件并 嵌 入VC + + 。4 ) 使 用MAT L AB 在V C + + 中 的 增 加插 件 , 将MA T L AB 文 件导 入VC + + 环 境 中 。5 ) 使 用 MA T L AB 提 供 的C ++ 接 口函数 库 , 直 接 在VC + +
G e n e t i c Al g o r i t h m,GG A)的 新型 加工 走 刀路 径 优
化 方法 。
MAT L AB混 合起 来 编 程 ,就 可 以高 效 地 编 写一 个
能独 立 于 MAT L A B运 行 环 境 ,且 运 行 效 率 高 的应
用 程 序 。本 文 以VC + + 开 发 环境 为 平 台 ,设 计基 于 DXF 文 件 的 数 控 自动 编 程 软 件 , 并 通 过 VC+ + 和
用MAT L AB功 能 函数 。2 )用MAT L AB编 译 器 将
VC+ + 编 程 环 境 作 为 一 个 可 视 化 编 译 环 境 的 卓 越 应 用 软 件 开 发 工 具 ,虽 然 可 以开 发 从 底 层 系
统 到 高 层 用 户 的 各 种 应 用 软 件 , 但 是 在 工 程 计
务l 訇 秒 化
MA T L A B 和V C 混合编程在数控加工路径优化中的应用

C#与MATLAB混合编程图解

C#与MATLAB混合编程图解

C#与MATLAB混合编程图解一、目的:为了使MATLAB的函数能被C#代码调用。

二、说明:MATLAB的代码必须写成function类型;使用的VS版本为Microsoft Visual Studio 2008;使用的MATLAB版本为MATLAB R2013A;操作系统为32位win7系统。

三、以加法这个简单例子详细介绍如何在C#中调用MATLAB的加法函数步骤一、在MATLAB编写一个加法的function。

步骤二、在VS上新建一个项目,注意类型项目选择Visual C#中的Windows,模板选择“类库”,名称、位置、解决方案名称自己定义。

点击确定,出来下图:将上述代码补充如下(注意要将“public class Class1”中的class改为interface,因为我们再此需要制作一个接口,供C#调用MATLAB函数):同时,选择下图中的“引用”,单击右键,选择“添加引用”。

选择下图中的MathWorks,.NET MWArray API,单击确定。

成功添加了该API步骤三、在C#上生成接口DLL首先,将下图中的Any CPU通过选择配置管理器将CPU配置为x86.配置结束后的结果如下:然后,右键点击myclasslibrary,选择“生成”,如果非首次生成,则选择“重新生成”。

之后,右键点击myclasslibrary,选择“在Windows 资源管理器中打开文件夹”,出现下图双击bin,选择x86,直到找到如下的myclasslibrary.dll文件步骤四、在MATLAB上生成function的dll文件首先,将上面的myclasslibrary.dll拷贝到MATLAB的myadd函数的目录下然后,在MATLAB的命令窗口输入如下命令出现如下窗口Name和Location自行定义,Type选择.NET Assembly,最后我修改为下图点击OK之后,出现选择Add classes,出现Class1自行起名字,我改为CS,表示C#。

Matlab与Visual C++混合编程学习笔记

Matlab与Visual C++混合编程学习笔记

Matlab与Visual C++混合编程学习笔记要实现VC++与matlab的无缝混编,必须充分掌握matlab的C/C++数学库函数和图形库函数,而要运用这两类库函数则必须先熟悉matlab的接口类与接口函数的结构及使用规则。

1 Matlab接口类与接口函数的介绍接口类 mwArray(1) 构造函数mwArray()默认构造函数,通过它用户可以创建一个未初始化的mwArray类对象(阵列)。

mwArray(const char *str)通过该函数可以构造一个字符串型的阵列,并通过输入的字符串指针指向的字符串进行初始化,例如:mwArray A(“MATLAB mwArray string”); mwArray(int32 rows, int32 cols, double *real, double *imag = 0) 通过该函数可以创建一个指定行数、列数、以及实部和虚部数据的二维复数阵列,例如:double real[] = {1, 2, 3, 4, 5};double imag[] = {6, 7, 8, 9, 10};mwArray A(1,5,real,imag);mwArray(const mwArray &mtrx)mwArray(const mxArray *mtrx)mwArray(double start, double step, double stop)mwArray(int32 start, int32 step, int32 stop)mwArray(const mwSubArray & a)mwArray(double)mwArray(int)(2) 索引和下标函数operator ()cell ()field ()(3)转换函数operator double() const(4) 内存管理函数类mwArray对运算符new和delete进行了重载。

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文件。

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++。

matlabcompiler与c语言混合编程

matlabcompiler与c语言混合编程

matlab compiler与c语言混合编程经过一个多月的努力,在老师的帮助和自己的琢磨之下,终于对vc与matlab的混合编程有所了解。

且举一例。

首先要在自己的matlab7.0上安装MEX和mBuilder,安装方法是在matlab命令窗口中输入mex-setup,按照一系列的步骤安装下去。

然后再在命令窗口中输入mbuilder-setup,同样的方法就可以安装mbuilder。

在matlab中打开一个空的m文件,向里面写下列代码,并将其保存为zhengtaifenbuhanshu.m:function y=zhengtaifenbuhanshu(x,u,d)%x为变量,u为均值,d为方差y=normcdf(x,u,d);我的目的是在c语言中可以调用matlab中的正态分布函数。

这个函数有三个输入参数,一个输出参数。

然后在matlab命令行中打入:mcc -l zhengtaifenbuhanshu.m -o dllnormcdf。

这样就生成c共享(动态)库文件。

其中zhengtaifenbuhanshu.m是要编译的m文件,最后编译的名称为dllnormcdf。

-o表示要编译成的名字,如果没有-o,则编译后生成的文件名是与第一个要编译的文件名一致,就是这里的zhengtaifenbuhanshu。

上面命令的作用是将zhengtaifenbuhanshu.m函数生成名字为dllnormcdf的c语言动态库。

注意编译的路径,如果zhengtaifenbuhanshu是你放在一个matlab中work的一个包中,那么matlab主窗口上面的Current Directory要选择好zhengtaifenbuhanshu.m这个m文件所在的地方。

按回车编译成功后,你会在编译的文件夹(默认的是work中)中看到多了几个生成的文件:dllnormcdf.cdllnormcdf.ctfdllnormcdf.dlldllnormcdf.expdllnormcdf.exportsdllnormcdf.hdllnormcdf.libdllnormcdf_mcc_component_data.c在生成的文件中,dllnormcdf.h文件是编译结果函数库的函数声明头文件,而dllnormcdf.lib文件是最终用户在编译自己的可执行应用程序所必须的库文件,dllnormcdf.dll 文件就是最终用户的可执行应用程序运行时所需要的动态库。

Matlab与VC混合编程在图像处理中的应用

Matlab与VC混合编程在图像处理中的应用

技 术 开 发 的矩 阵运 算 动 态 链 接 库 。用 Macm 实 现 to
V C与 Mal t b连接有 两 种方 式 : 用 Mar < I > 阵 a 调 tx LB 矩 i 数 学 库 , v 5 1.b库 文 件 ; 用 Mac m 的 V sa 即 40 vi 1 利 to iul
编程, 并用 于图像 处理 。
关键词 : d b V Ma a ; C;引擎 ; 图像 处理
引 言
Ma a t b是 Mah ok 公 司推 出 的数 学软 件 。 将 l tw rs 它 数 值分 析 、 阵计 算 、 号 处理 和 图形 显 示结 合在 一 矩 信
Macm 中包 含 了矩 阵数学 库。 tx LB C + to Mar < I > + 。Ma i . tx L B C + 学 库 是 Mah o l 司 利 用 Ma o i r< I > + 数 tT os公 t m c
具箱 中的 函数 。
现 代  ̄E gls : 闭 Malb引擎 ; nc e关 o t a 计 ● E g eA ry 从 Ma a nie 中 获 得 一 个 nG tr : a tbE g l n 算 Ma a t b矩 阵 , l 用于数 据交换 ; 机
 ̄E g p n 开启 Malb引擎 ; nO e : t a ●E g v ltn :在 Ma a nE a r g Si l f b引 擎 中执 行 输 入 的

Ma a 令 ; t b命 l
② 使 用 M t m 与 M tb连 接 。 M t m 是 ao c aa l ao c
Mah ok 公 司 推 出的 第 一个 由 Ma a tw rs t b到 C +的编 l +

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文件中有导出的函数原型。

Matlab与C混合编程在火电仿真软件开发中的应用

Matlab与C混合编程在火电仿真软件开发中的应用
的类 型和路 径 。安装 配置 C编译器 如下 :
1 C语 言 me x程 序 及 编 译 环 境 配 置
1 1 C 语 言 me . x程 序
一பைடு நூலகம்
在 Malb 令 窗 中键 人命 令 : xst p 然 后 .a 命 t me eu ,
根据 提示选 择 编译 器类 型 ( / + 十编译 器 ) CC 以及编 译器 的版 本数 。不 同 的 系统 中 , 作 步 骤 可 能稍 有 操
琐 的入 口子程序 . 可编写 C语 言 Ie 就 T X文件 , 高 了开发效 率 。 实践证 明 , I 提 该方 法 能有效 的 用于仿 真 软件 开 发, 使得 复杂动 态对 象仿真 模块 简洁 高效 , 可 以起 到保 护算 法安 全和 知识 产权 的作 用 。 还 [ 关键词 ] Malb Smuik C语 言 动 态链 接库 t /i l a n [ 图分 类号 ] TP 9 . 中 3 19 [ 文献标 识 码] A 提 供 了一 种 调 用 C 语 言 函 数 的 接 口方 法 。其 中 1e T X程 序用 c语 言按一 定格 式编 写 , c编译 器 编 I 由 译 成 dl l文件 。其 调试过 程 在 VC I E 中完 成 , 成 D 生 1e T X文 件后 即可 在 Malb中直接 调用 】 I t a 。 C语言 1e T X文 件 主要 由两 部 分组成 , I 第一 部 分 称 为入 口子程 序 , 其作用 是在 Malb系统 与被调 月 t a ] 的外 部 子 程 序 之 间 建 立 通 信 联 系 , 编 写 分 繁 其 卜 琐 。第 二部 分称 为计 算 功 能 子程 序 , 包 含 所 有 实 它 际需 要完 成 的功 能的源 代码 , 由入 口子程 序 调用 。 本文采用 CT xS函数实 现混合编 程 , me— 函 1e- l C xS
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 = new DotNetTest.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.MWNumeric Array.MakeSparse(
// 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());
}
}
}。

相关文档
最新文档