需求:
对.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引擎】进行实现。