完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
C#与matlab混合编程总结: 一、 C#调用Matlab函数 1. 动态链接库调用 ① 制作matlab--M函数 ② >>mbuild –setup 选择VS2008 ③ >>mcc -Bcsharedlib:** **.m **表示文件名 生成**.dll动态链接库 ④ 使用C#调用动态链接库的方式调用**.dll 附加特性说明: usingSystem.Runtime.InteropServices; [DllImport("**.dll")] ⑤ 若调用失败,则是Matlab环境配置错误。 若已安装Matlab,请修改系统环境变量Path, **runtimewin32;**binwin32 **表示Matlab安装目录 若未安装Matlab,请安装Matlab运行环境,软件名为 “MCRInstaller.exe” ⑥ 与matlab动态链接库数据交互 a. **Initialize() 初始化Matlab运行环境 b. **Terminate() 结束Matlab运行环境 c. IntPtr 用此类型替代指针 d. 下面语句用于建立一个与Matlab进行数据交互的矩阵 [DllImport("libmx.dll")] static extern IntPtrmxCreateNumericMatrix(uint m, uint n, mxClassID classid, int flag); m*n表示矩阵维数,mxClassID表示矩阵种类,flag:0实数,1复数; e. 下面定义的枚举类型用于表示矩阵种类 public enum mxClassID { mxUNKNOWN_CLASS = 0, mxCELL_CLASS, mxSTRUCT_CLASS, mxLOGICAL_CLASS, mxCHAR_CLASS, mxVOID_CLASS, mxDOUBLE_CLASS, mxSINGLE_CLASS, mxINT8_CLASS, mxUINT8_CLASS, mxINT16_CLASS, mxUINT16_CLASS, mxINT32_CLASS, mxUINT32_CLASS, mxINT64_CLASS, mxUINT64_CLASS, mxFUNCTION_CLASS, mxOPAQUE_CLASS, mxOBJECT_CLASS, /* keep the lastreal item in the list */ }; f. 下面语句用于提取矩阵中数据的首地址 [DllImport("libmx.dll")] static extern IntPtr mxGetPr(IntPtr pa); g. Marshal.Copy(…) 用于矩阵数据地址与C#中数组进行数据交互 h. 调用matlab函数时,返回值为矩阵的地址,通过下面的语句提取出矩阵。c表示输出矩阵。 //首先对输出进行初始化,初始化参数随意 IntPtrc = mxCreateNumericMatrix(0,0,0,0); //调用结束后,c表示矩阵的地址,需调用下句更改c值 c= Marshal.ReadIntPtr(c); 2. Matlab的 Engine调用 a. 动态链接库libeng.dll [DllImport("libeng.dll")] static extern IntPtr engOpen(string startcmd); [DllImport("libeng.dll")] static extern int engPutVariable(IntPtr ep,stringvar_name,IntPtr ap); [DllImport("libeng.dll")] static extern int engEvalString(IntPtr ep,stringstr); [DllImport("libeng.dll")] static extern IntPtr engGetVariable(IntPtr ep,stringname); b. COM组件: 添加引用mlapp.tlb MLAppClass ep= new MLAppClass(); ep.Visible =0;//隐藏engine窗口 ep.PutWorkspaceData("a","base", a); object b; ep.GetWorkspaceData("a","base", out b); ep.Execute("figure");//执行字符串命令 ep.Quit(); 3. COM组件 找到文件夹F:MATLABR2010aruntimewin32 注册里面的文件 mwcomutil.dll 命令:regsvr32 mwcomutil.dll >>deploytool 修改name, Target->Generic COM Component Add class Add file Build 在C#工程文件里引用COM组件,根据name找到自己定义的组件。 若想删除组件,可以找到组件地址,然后regsvr32 /u **.dll 4. .NET >>deploytool 修改name, Target->.net Assembly Add class Add file Build 在C#工程文件里引用->浏览,找到生成的目标 **.dll。 若想进行数据交互需 引用 net :MathWorks .net MWArray API 二、 Matlab调用C#代码 通过调用C#制作的COM组件实现。
①. 新建类库 ②. 属性设置:应用程序->程序集信息->使COM可见 生成 –> 为COM互操作注册 签名 –> 为程序集签名 –> 新建(无密码) ③. 代码实现,必须含有接口 publicinterface I**//定义接口 { [DispId(0)]//方法前加其可见 Doubleadd(double a,double b); //这是个例子 } publicclass **:I** { //写接口方法的实现 } 编译结束 ④. 查看COM组件的信息,应用VC++6.0的工具OLE/COM Object Viewer a.查看ProgID ObjectClasses->Grouped by…->.Net…->**.$$ **表示COM名字,$$表示类名 b.查看类中的方法 Type …->**->(右键)view **表示COM名 ⑤. 卸载COM 将属性设置 生成 –> 为COM互操作注册 取消 然后再次编译
①. H =Actxserver(‘ProgId’) //ProgId可以通过上面知识获取 返回类的实例。 ②. H.get(‘method’,参数1,…) Method是实例内部方法,通过上面知识获取。后面为方法形参
|
|
相关推荐
|
|
学习总结挺好的 方便以后回顾历程
|
|
|
|
|
|
好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好
|
|
|
|
|
|
使用simulink进行三相短路故障分析时,各参数应该如何设置
1369 浏览 1 评论
想请教一下图中是simulink的什么模块,需要这种三段斜率函数模块但没找到在哪
1477 浏览 1 评论
2393 浏览 1 评论
200圆!求助大佬给一份VSG并网和离网模式的simulink仿真
2658 浏览 0 评论
MATLAB(3)--矩阵的引用(sub2ind、ind2sub、reshape函数使用)
3489 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 09:05 , Processed in 0.565290 second(s), Total 77, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号