C#和matlab混合编程

  C#和MatLab的混合编程,充分利用了winform的直观显示和matlab的强大计算能力。在此以一个小例子的形式给大家讲述一下二者混合编程的实现。

  

  一、软件的配置说明

  C#版本:VS2010        matlab版本:matlab2013a

  二、把 matlab函数编译成dll文件 

  2.1首先写一个函数的.m文件(如下函数MatrixOpera实现两个矩阵的相加和相减)

%--------------------------------------------------------
function [addRlt,minusRlt]=MatrixOpera(a,b)
% 矩阵相加,相减
[m1,n1]=size(a);
[m2,n2]=size(b);
if m1~=m2 || n1~=n2
    display(‘矩阵大小不相同‘)
    error(‘参数错误‘);
end
addRlt=a+b;
minusRlt=a-b;
end
%-----------------------------------------------------------

 

   2.2 创建制作的dll文件的工程

  在MatLab的命令窗口中,输入deploytool打开创建dll文件的工程创建窗口,如下图所示

  

  在图中,主要分为三部分,Name:你想要命的工程名,prj是工程的后缀;Location:创建工程的储存位置;Type:针对c#而言,我们需要选择.NET Assembly这一项

  点击Ok选项,工程已经创建完毕

  2.3 向所建工程中添加对应的元素并编译

  上述过程中,新建了一个叫matPrj的工程(它相当于c#中的命名空间namespace);然后给它增加class(它就是c#中的类),点[add class]添加myMathClass;之后再给它添加方法(它就是函数了),点[add files],本实例中选中之前编写的MatrixOpera函数。完了之后就可以编译了,编译需要一两分钟的时间,如下图所示

  

  三、C#中添加matlab的dll引用

  3.1打开vs2011,新建一个窗体应用程序

  

  3.2完成dll文件的拷贝

  将matlab工程(matPrj)src文件夹下的matPrj.dll和D:\Program Files\MATLAB\R2013a\toolbox\dotnetbuilder\bin\win64\v2.0(前边为matlab的安装路径)文件夹下的MWArray.dll拷贝到VS工程(CallMatlabDllApp)下的\bin\Debug文件夹下

  

  3.3在VS里添加dll文件的引用,然后在代码前引用相应的命名空间

  

  

    

  

  如果matlab函数复杂,还需要用到其他的空间,则视情况而定,自己凭经验添加。

  至此,已经可以利用c#调用我们用matlab编写的函数了。

  四、在C#中调用matlab提供的函数

  matlab中一个m*n的矩阵对应.net中的一个1*(m*n)的数组,因此在C#中调用matlab函数的关键是掌握数据类型一致的一个矩阵与一个数组之间的转换。包括以下两个问题:

  a、将C#中的参数输入到matlab函数时,要将参数转化为matlab的参数形式,通常是MWArray类型

b、matlab函数返回的参数,也要转化为C#用的类型,比如数组或者数值类型

  在C#中调用本例函数的代码如下:

            matPrj.myMathClass test = new matPrj.myMathClass(); //将myMathClass类实例化

            double[] a = { 1, 2, 3, 4, 5, 6 };//定义两个输入参的值
            double[] b = { 1, 1, 1, 1, 1, 1 };//它们是两个一维数组

            double[,] c = new double[3, 2];//定义C#中接收输出参数的类型
            double[,] d = new double[3, 2];//是两个二维数组

            //把两个输入参数都转换成中间类型,中间类型也是矩阵所以要指明维数
            //这里将两个输入参数转换为两个三行两列的矩阵
            MWNumericArray matlab_a = new MWNumericArray(3, 2, a);
            MWNumericArray matlab_b = new MWNumericArray(3, 2, b);

            //输入参数成功转化为一个MWArray矩阵
            MWArray[] agrsIn = new MWArray[] { matlab_a, matlab_b };

            //声明输出参数是一个MWArray矩阵两个输出参数,一定要写数量
            MWArray[] agrsOut = new MWArray[2];

            //调用matlab函数,2表示输入参数的个数,输出参数前需要加 ref 关键字
            //此例实现了两个三行两列的矩阵相加减
            test.MatrixOpera(2, ref agrsOut, agrsIn);

            //把两个输出参数转换成中间类型
            MWNumericArray net_c = agrsOut[0] as MWNumericArray;
            MWNumericArray net_d = agrsOut[1] as MWNumericArray;

            c = (double[,])net_c.ToArray();//输出参数成功转化为二维数组
            d = (double[,])net_d.ToArray();
            //一定要注意最后c和d的转化,不同类型的转换差异很大厄
            //ToArray()对应n*m的数组
            //ToVetor()对应1维数组
            //ToScalarDouble()对应单个数值

            for (int i = 0 ; i <= 2; i++)//输出结果验证
            {
                for (int j = 0; j <= 1; j++)
                {
                    textBox1.Text += c[i, j].ToString() + " ";
                    textBox2.Text += d[i, j].ToString() + " ";
                }
                textBox1.Text += "\r\n";//换行
                textBox2.Text += "\r\n";
            }

  

  MWNumericArray是MWArray与C#等语言数据转换中间类,实现C#与matlab函数间传递参数的功能

  MWArray是总类型,其它的以MW开头,以Array结尾的变量类型都可以直接对它进行赋值或取值,它是.m文件的编译后内部的标准类型,一切C#类型都要最终转换成此类型,方可作为参数调用matlab函数

  

  我在运行上述程序时,第一句将myMathClass类实例化报错

  但是单看这语句是没有任何问题的

  matPrj.myMathClass test = new matPrj.myMathClass();

  查阅了关于错误的信息,但是解决的都基本是换了一个matlab版本才解决的,偶然看见说HRESULT:0x8007000B的错误和编译平台有些关系,就开始着手试试是不是因为我这平台的问题导致的,果然,换了编译的平台就好了。

  具体解决:

  1:右键项目名称—>属性—>生成

  2:目标平台选择x64

再次运行程序,结果如下:

上述结果同下图在matlab中实现效果相同,验证结果的正确性

  脱离matlab安装的环境下,如何实现程序的运行自如: 

  通过com组建的形式进行混合编程,如果机器上没有安装MATLAB,编译生成的软件照样可以使用,但是需要安装MATLAB提供的MATLAB Compiler Runtime(MCR),这个软件在MATLAB的安装目录下:X:\MATLAB\R2013a\toolbox\compiler\deploy\win32\MCRInstaller.exe(X是MATLAB安装的盘符),如果你的电脑上安装了MATLAB,则不需要在重新安装这个软件。另外,不同的MATLAB版本提供的MATLAB Compiler Runtime可能会不同,如果在另一台电脑上自己编写的软件运行有问题,可能是编译器的版本不同引起的

参考资料:http://wenku.baidu.com/link?url=mgBBgQFt89s-7rKrNbJ-630AH0q_2mMMYBbvCWx9IiGkuOQ7qFTkL_pZRhT5FqazmtFoD6UUM6vWLeDrprF2OAGqUcmrHEugVntjWvzCwxy

     http://www.cnblogs.com/liuxiaowei0543/p/3682377.html

     http://wenku.baidu.com/view/6ad3b62b59eef8c75fbfb3ed.html

时间: 2024-10-03 19:59:11

C#和matlab混合编程的相关文章

c#与matlab混合编程探索

以下讲述如何使用c#来调用matlab函数实现北斗定位算法的仿真 1.准备 首先需要matlab2010,vs2010(其他版本是否可行,未知),另外需要安装matlab的辅助工具MCRInstaller(该工具无需下载,在安装好的matlab程序包中可以找到,例如:E:\matlab 2010\toolbox\compiler\deploy\win32) 2.准备matlab程序 上述截图是我的定位程序所涉及到的函数 3.matlab程序处理为dll文件,供c#调用,处理的基本步骤如下: (1

VC与Matlab混合编程之调用动态链接库dll(C++)——&lt;二&gt;

VC与Matlab混合编程之调用动态链接库dll--<二> 1.是先建立 matlab 的 m 文件. ellipsefit.m 其包含:function [Xc,Yc,A,B,Phi,P]=ellipsefit(x,y) 2.MCC命令编译生成得到h.dll.lib等文件 在matlab命令行中输入: mcc -W cpplib:ellipsefit ellipsefit.m -T link:lib (此方式为c++风格函数) (具体命令含义可参考<精通matlab与C/C++混合程序

VC++和Matlab混合编程(在VC中调用将.m文件生成的DLL)

这是师兄们在实际项目中用到的关于VC++和MATLAB混合编程的实例.最近自己在瞎鼓捣,也就研究了下这块,本想写篇博文,但网上这块的资料还算是比较多,写的也比较具体,想着不重复劳动,因此我也就不写了. //提取节点信息 mxArray *csd_path; mxArray *save_path; mxArray *mat_path=mxCreateCellMatrix(NULL,NULL);//mxCreateCellMatrix:创建二维单位矩阵 mxArray *analog=mxCreat

java/matlab混合编程应用移植到其他电脑上遇到的问题

问题1:jar包部署在其他电脑上设置vm参数无效 @echo off start java -Xmx1028M -Xms1028M -XX:PermSize=100M -XX:MaxPermSize=100M -XX:SurvivorRatio=8 -jar Edition_1.0_fat.jar 要把参数设置在前面才有效,开始把jar包放前面虽然自己电脑能运行但是其他人的电脑不能运行 问题2:# An unexpected error has been detected by HotSpot

VS2013调用MATLAB混合编程

Visual Studio和MATLAB混合编程,有两种方法: 1 MATLAB调用C程序: 2 VS调用MATLAB(目前见到的都是VS,其他编译器如codeblocks,或不提供这项功能): 前一种是用MATLAB的mex命令调用VS或其他编译器,将以一定方式编写出的C文件编译成.mexw32(针对win32)或者.mexw64(针对win64),然后MATLAB就可以用调用动态链接库的方式,调用C程序.这一过程中,只需要在安装好编译器的前提下,执行: mex -setup 和 mbuild

C++和MATLAB混合编程-DLL

先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件加载入内存.并且DLL在运行时是共享的,即当多个程序调用时,内存中也只保持一份动态链接库. 动态链接库的调用有显式和隐式两种方式. 隐式链接需要用到我们前面生成的plotdata.c,plotdata.h,plotdata.lib以及plotdata.dll文件. 首先将plotdata.c,plo

关于C++与Matlab混合编程错误??? Unexpected Standard exception from MEX file.

 最近在用c++和matlab 混合编程是遇到了一些问题,如下: ??? Unexpected Standard exception from MEX file. What() is:c:program Error in ==> mscale at 32 [rho,s] = matscale(abs(a),0.01); Error in ==> utScaledExpm at 7 [s,junk,a] = mscale(a,'noperm','safebal'); Error in ==&

C/C++与Matlab混合编程初探

欢迎转载,尊重原创,所以转载请注明出处. http://blog.csdn.net/bendanban/article/details/37830495 Matlab 拥有丰富的功能,编程简单.不过,有些情况下,Matlab程序的执行速度比较慢.C/C++编译执行的程序速度比较快,编程难度上比Matlab要高一些.因此存在一种方案,就是使用Matlab实现我们的实验程序,用C/C++来实现Matlab程序中比较耗时的部分,从Matlab程序中调用C/C++的程序以实现加速. 本文主要讲解如何在M

FORTRAN &amp; MATLAB 混合编程

[email protected] 第一部分:Fortran调用Matlab引擎 1  什么是Matlab引擎 所谓Matlab引擎(engine),是指一组Matlab提供的接口函数,支持C/C++.Fortran等语言,通过这些接口函数,用户可以在其它编程环境中实现对Matlab的控制.可以主要功能有: ★ 打开/关闭一个Matlab对话: ★ 向Matlab环境发送命令字符串: ★ 从Matlab环境中读取数据: ★ 向Matlab环境中写入数据. 与其它各种接口相比,引擎所提供的Matl