MATLAB与C#混合编程的两种方法

写程序少不了参考别人的经验,因为参加项目需要,在进行系统开发的时候,需要用到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;

扫描二维码关注公众号,回复: 8916697 查看本文章

 

完成后出现如下图,接下来就是等待了;

 

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[,];
            

        }

发布了21 篇原创文章 · 获赞 8 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_40405758/article/details/81940071