我是靠谱客的博主 丰富电源,最近开发中收集的这篇文章主要介绍c 和matlab相互调用,Matlab与CSharp相互调用的一些知识,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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组件实现。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互操作注册 取消

然后再次编译Matlab调用COM

①. H =Actxserver(‘ProgId’)  //ProgId可以通过上面知识获取

返回类的实例。

②. H.get(‘method’,参数1,…)

Method是实例内部方法,通过上面知识获取。后面为方法形参

最后

以上就是丰富电源为你收集整理的c 和matlab相互调用,Matlab与CSharp相互调用的一些知识的全部内容,希望文章能够帮你解决c 和matlab相互调用,Matlab与CSharp相互调用的一些知识所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部