概述
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相互调用的一些知识所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复