博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#与Matlab混合编程

Posted on 2008-09-17 20:49  hnboy  阅读(4671)  评论(0编辑  收藏  举报



(VS2005+Matlab7.5)制作dll步骤:star——matlab——Matlab Builder for .net——deployment tool——新建——Matlab Builder for .net——.Net component——右键add file——找目标M文件——编译

VS2005引用:引用编译的dll,同时保持*.ctf在同一文件夹下

Code

 

Code

MWNumericArray是MWArray和c#中数据的中间类,怎么用?怎样在C#与matlab间传递参数?
a.double型、int型等数值类型的变量传递
MWNumericArray i = null, result = mydouble;
i=4;
myClass myclass = new myClass(); //实例化
result = (MWNumericArray)myclass.myfunc(i);

b.字符串(需要用到MWCharArray和MWArray转换)
MWCharArray FileName = myString;
MWNumericArray sensitivity;
sensitivity = (MWNumericArray)myClass.myAlgorithm((MWArray)FileName);

c.多个输出参数组成的数组
MWNumericArray out_Arr = (MWNumericArray)out_Args[1]; //取出第一个参数返回的数组(matlab返回的数组下界是从1开始的)

取出数组中的一个元素值
mydouble=out_Arr[i].ToScalarDouble();

如上面例子ToScalarDouble一类的toXXXX等方法还有许多。

d.result.toArray可以把matlab返回的矩阵变成C#的n x m数组,eg:

double[,] csArray= (double[,])result.ToArray(MWArrayComponent.Real);

e.将数组传入Matlab(和传递单个数值的方法一样)
double[,] dbx = new double[2, 2] { { 1, 2 }, { 3, 4 } };
MWNumericArray x=dbx;
myclass.picture(x);


 

M文件如何接收和返回?

function x=test(h,d)   //接收两个参数,返回一个

function [x1,x2]=test(h,d)   //返回数组 


 

以上为.Net方式连接,以下为COM方式连接(编译速度而言.net的方式要快上很多,而且似乎比较稳定)

matlab编译工作
- mbuild -setup
- deploytool,Matlab Builder for .net,Generic COM Component
- 添加m函数文件(eg: myfunc.m),改类名(eg: myComClass),build

注册dll
regsvr32 myCom.dll
regsvr32 mwcomutil.dll

VS2005调用:
- Reference加Com控件
- 调用示例
double[,] arr = null;
object in_a, out_a;
in_a = 500;
out_a = arr1;
myCom.myComClass mc = new myCom.myComClass();
mc.myfunc(1, ref out_a, in_a);


 

小例子:(提取matlab返回的两个参数并转化为C#的矩阵)

Code
其中的M文件:
Code