C# matlab混合开发----------调用matlab封装的Dll及数组类型转换

需求:

对.m文件进行c#封装,让其执行预定运算。

1.matlab的.m文件封装成DLL(在matlab中完成)

将matlab的算法在matlab中完成封装DLL,注意封装前一定要进行参数化,将其封装 成matlab的自定义函数,如下示例:

.m文件示例

function [ R1 ] = M1( l,d)
%%该函数用于求管片最小纠偏半径
%输入:
     %l:管片长度
     %d:每环最大纠偏量
%输出:
     %y: 管片最小纠偏半径

R1=(l^2+d^2)/(2*d);

end

再将其进行DLL封装,再此不再赘述,请参考【visual studioC#调用MATLAB生成的DLL】

2.在C#进行DLL的调用

引入DLL,并进行调用,将输入输入都进行数组MWArray封装,指定输入的参数,指定输出的长度。

(1)简单输出

using MathWorks.MATLAB.NET.Arrays;//引入MWArrray
using M;//引入封装好的DLL

float l = Convert.ToSingle(textBox1.Text);   //string类型转换为float类型    
float d = Convert.ToSingle(textBox2.Text);   //string类型转换为int类型  

M.Class1 fun1 = new M.Class1();  //实例化对象
MWArray[] args1In = new MWArray[] { l, d };//定义输入
MWArray[] args1Out = new MWArray[1];//定义输出
fun1.M1(1, ref args1Out, args1In);//执行封装的方法
String R1 = args1Out[0].ToString();//转为String
textBox9.Text = R;//输出在文本框

(2)类型转换:MWArray   -->  Array,输出数组

MWArray[] args6In = new MWArray[] { i, x, y, R, l, L, X, c };
MWArray[] args6Out = new MWArray[3];

MWNumericArray D = args6Out[1] as MWNumericArray;//第一步:MWArray转换成中间类型MWNumericArray
MWNumericArray E = args6Out[2] as MWNumericArray;

Array arr1 = D.ToArray();//第二步:MWNumericArray类型  -->  c#的array类型
Array arr2 = E.ToArray();

double[,] dArr1 = (double[,])arr1;//第三步: c#的array类型 --> c#的double[,]类型,注意必须用double[,]接收
double[,] dArr2 = (double[,])arr2;

3.实际运行调试

可以在安装matlab 软件下的进行,或者安装MATLAB提供的MATLAB Compiler Runtime环境(只装这个环境,不用装matlab)

可以参考【C#和MatLab的混合编程(充分利用二者的优势)】

4.总结

这种方法适合matlab算法内部耦合度低,调用其他算法或者matlab库较少的算法,如果耦合度很高,建议使用【matlab引擎】进行实现。

 

 

 

 

你可能感兴趣的:(C#)