写程序少不了参考别人的经验,因为参加项目需要,在进行系统开发的时候,需要用到MATLAB和C#的混合编程,为此总结了一下经验~
1.编程工具 我使用的是VS2013 及MATLABR2015b,一般来说,混合编程对版本要求不是很高
2.先总体介绍一下两种混合编程的大致区别:
(1)目前使用最广的方法是先封装MATLAB程序为dll文件,然后在VS中进行引用,便可以在VS中调用其封装的函数,封装dll的方法MATLAB里有,并且比较简单,后面会附上详细的教程。封装dll的引用方法比较受欢迎可能是这种方法相对来说比较普及,且封装dll适合任何程序,也就是说你用MATLAB写的程序度可以封装成dll,听起来是不是很cool,没错,不仅仅是某种函数的算法,只要是可以用的程序度可以封装。
这种方法最大的缺点也就是在封装dll文件时,MATLAB必须要配置好环境,很多没有调试成功主要问题也出现在这,后面详细介绍
(2)当然第二种方法就不需要封装成dll了,感觉是不是很棒,你只需要将你编写的MATLAB文件放在你用VS创建项目的bin文件夹下面,这种方法的局限性在于它更适合于函数数值计算,因为在调用传递参数的时候,一般的数值,字符串,泛型类型度可以,只要不是像什么shp图形文件数据或者其他类型的文件数据,因为小编在使用这种方法的时候就碰到过shp文件数据无法直接传参,也就不得不使用了封装dll的方法,好了,说了折磨多,赶紧上点干货。
一:调用dll文件形式
1.确保安装好MATLAB及VS,版本要求不高,但是确保MATLAB是安装的破解文件,也就是必须是包含“mcc”以及“compiler”文件,如果不是完全破解,在后期的MATLAB编译以及打包会出现错误。
2.封装MATLAB程序为dll
1.打开MATLAB,在出现的界面中依次点击“新建----->函数”
在这里我就编辑一个最简单的画图函数,之后在窗口命令行中输入deploytool, 出现后选择第三个 Library Compiler如图:然后接下来便是选择设置,按照图上操作;最后选择Microsoft Framework时,一般选择4.0;
完成后出现如下图,接下来就是等待了;
3.VS里面配置引用环境并调用函数
首先VS里面新建一个窗体项目,我这取名叫test,选中并点击右键选择添加引用,按“浏览”查找,找到你生成dl的l文件夹,然后添加之后在VS里新建项目,然后写上代码:记得using drew;
代码如下图所示:
好了,运行后,结果如下图所示 :
第二种方法:直接调用MATLAB函数代码
这种方法很方便,值得注意的是:1.MATLAB程序可以放在VS创建工程项目的bin文件夹下的debug里2.VS项目中需要引用MLApp.dll,一般在添加引用时,在COM组件选项中寻找3.最好要安装好matlab软件,这里比较容易出错
下面贴出C#中如何调用MATLAB编写的矩阵相加的函数add(),c=a+b;
private void button1_Click(object sender, EventArgs e)
{
MLApp.MLApp matlab = null;
Type matlabAppType = System.Type.GetTypeFromProgID("Matlab.Application");
matlab = System.Activator.CreateInstance(matlabAppType) as MLApp.MLApp;
matlab.Visible = 0;//可见性
string path_project = Directory.GetCurrentDirectory(); //工程文件的路径,如bin下面的debug
string path_matlab = "cd('" + path_project + "')"; //自定义matlab工作路径 这里我注释调用
matlab.Execute(path_matlab);
matlab.Execute("clear all");
double[,] c;
double[,] a={{1,2,3},{2,3,4}};
double[,] b={{7,8,9},{1,1,1}}; //初始化变量
double[,] _a = new double[a.GetLength(0), a.GetLength(1)];
matlab.PutFullMatrix("a", "base", a, _a );
double[,] _b=new double [b.GetLength(0),b.GetLength(1)];
matlab.PutFullMatrix("b", "base", b, _b);
string comman = @"c=add(a,b)";
matlab.Execute(comman);
//获取调用结果值
var result1 = matlab.GetVariable("c", "base");
c= result1 as double[,];
}