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,

**\runtime\win32;**\bin\win32       **表示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:\MATLAB\R2010a\runtime\win32

注册里面的文件 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是实例内部方法,通过上面知识获取。后面为方法形参

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值