Matlab与.NET基于类型安全的接口混合编程入门

原文:【原创】Matlab与.NET基于类型安全的接口混合编程入门

如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标。

【原创分享】Matlab.NET混编调用Figure窗体 http://www.cnblogs.com/asxinyu/archive/2013/04/14/3020813.html

【原创】开源.NET下的XML数据库介绍及入门 
http://www.cnblogs.com/asxinyu/archive/2013/03/25/2980086.html

【原创】关于.NET下开源及商业图像处理(PSD)组件 http://www.cnblogs.com/asxinyu/archive/2013/03/21/2972491.html

【原创】.NET开源压缩组件介绍与入门 
http://www.cnblogs.com/asxinyu/archive/2013/03/05/2943696.html

【原创】开源Word读写组件DocX介绍与入门[资料已发送]  http://www.cnblogs.com/asxinyu/archive/2013/02/22/2921861.html

【原创】C#开源轻量级对象数据库NDatabase介绍【资料已发送】 
http://www.cnblogs.com/asxinyu/archive/2013/02/20/2918066.html

关键词:Matlab混合编程,C#调用Matlab,Matlab与C#混编,MCR,Type-Safe Interfaces

时间:2013年4月21日,5月5日例子Demo测试成功

1.前言

Matlab Builder NE 工具箱是与C#混编的工具箱,里面的帮助文档很详细,提供了4种情况下与.NET混合编程的案例。

1.是简单的组件集成,通过Matlab生成Dll程序集,在.NET环境中,通过MWArray组件来调用;

2.还有一个是在Web环境下使用Figure和混编的情况,与1比较类似;

3.另外一个就是我们今天要讲到的基于类型安全的接口编程,以及对WCF和MEF的支持;

4.最后一个是在.NET Remoting技术中的使用。

在初级入门教程中,以及我现在的混编开发中,都只是用到了第1个方法,和很简单,也很快,当然要你掌握了很多基础技术之后才能达到这个水平。今天要见到的基于接口的编程,有一个很大的好处就是可以避免类型转换,因为之前的方法都有大量的.NET和Matlab类型进行转换,基础不扎实的朋友很容易搞混淆。而基于接口的编程,则可以避免很多问题,但同时也对基础提出了更高的要求,要对接口定义,作用,以及方法多态等面向对象的特性更加了解。

下面截图是在Matlab帮助的说明:

2.Type-Safe Interfaces简单说明

与直接编译为.NET程序集的要求不同,使用这项技术对.NET程序员的要求小很多,只需要很少的Matlab知识,但要对.NET技术精通,

之前由于Matlab的数据类型和.NET的基本数据类型不兼容,所以为了使得Matlab和.NET程序进行数据通信,就需要使用下面的技术:

1)Marshal data from .NET input data to a deployed function by creating an MWArray object from native .NET data.

The public functions in a deployed component return MWArray objects.

2)Marshal the output MATLAB data in an MWArray into native .NET data by calling one of the MWArray marshaling methods (ToArray(), for example).

所以使用传统的混编方式,又很多数据类型转换的过程。而在使用Type-Safe Interfaces技术后,这些中间过程都可以忽略,

只需要关系输入的.NET类型以及输出的.NET类型结果,Matlab会对数据进行内部的转换处理。可以看看前后2副图的对比:

因此,我们可以很明显的看到Type-Safe Interfaces带来的优势:

You avoid training and coding costs associated with teaching end users to work with MWArrays.

You minimize cost of data you must marshal by either placing MWArray objects in type-safe interfaces or by calling MWArray-based functions in the deployed component.

Flexibility — you mix type-safe interfaces with manual data marshaling to accommodate data of varying sizes and access patterns.

For example, you may have a few large data objects (images, for example) that would incur excess cost to your organization if managed

with a type-safe interface. By mixing type-safe interfaces and manual marshaling, smaller data types can be managed

automatically with the type-safe interface and your large data can be managed on an as-needed basis.

3.Type-Safe Interfaces实际案例

对这个混编方式,很显示可以节省很多事情,我认为,作为原始的数据类型转换方式,还是应该掌握的。在掌握了之后,再使用这个方法,会事半功倍,毕竟不是所有的问题都可以用接口解决。接下来,就让我们一起用一个小的编程实例,来演示整个过程的使用。

演示环境:Visual Studio 2010,Matlab 2012a,.NET 4.0

演示内容:一个简单的乘法运算混编实现

一、新建一个 类库类型的项目 ,名称MatlabDemo,.NET 4.0,如下图所示:

一、在上面的项目中添加一个接口文件IMultiply.cs,并编写下面的代码,因为我们实现的是一个简单的乘法,所以添加如下几个接口方法:


 1 namespace MatlabDemo
2 {
3 /// <summary>乘法接口</summary>
4 public interface IMultiply
5 {
6 //2个数直接相乘
7 double multiply(double x, double y);
8
9 //数组相乘
10 double[] multiply(double[] x, double y);
11
12 //矩阵相乘
13 double[,] multiply(double[,] x, double[,] y);
14 }
15 }

这里注意,一定要将接口的可访问性设置为Public,否则混编的时候,Matlab会找不到接口原型,编译失败。编写好,编译项目即可,会在bin文件夹下得到MatlabDemo.dll文件,这个文件下面的步骤会用到。

三、编写M函数,并设置混编项目。我们编写一个简单的乘法M函数m,如下所示:

1 function z = multiply(x, y)
2
3 z = x * y;

注意这里的名称一定要和接口方法的名称对于起来,否则Matlab怎么会认识,想想就明白了。然后在Matlab中输入deploytool命令,输入项目名称:TypeSaftDemo,并选择项目类型:.NET Assembly,这个过程是“混编三部曲”基本过程,以前的视频中专门见到了,不仔细说明,如下图所示:

确定之后,混编项目基本就建立了,然后新建一个类DemoTest,并把上面编写的multiply.m函数添加到这个类中去,这其实就是一个常规的混编过程,很简单。添加完成之后,如果是普通的混编方式,直接编译就可以了,但基于接口的混编方式,还有一个过程要设置,看下图,单击混编项目的设置(Settings...):

如下图,打开设置后,选择“Type Safe API”选项卡:

首先,选择我们在第一个过程中编写好的MatlabDemo.dll接口文件,选择后,程序会自动搜索该dll中的可用接口(公开的),在.NET interface下拉列表中显示,选择你需要的,这里我们是IMultiply,如下图所示的MatlabDemo.IMultiply,然后选择该接口和Matlab混编程序中对于的类,我们的multiply.m函数在DemoTest类中,如下图的Wrapped class:

设置完成之后,关闭即可。然后编译,如果没有问题,提示编译成功之后,打开编译好的文件夹,我们可以看到如下3个dll文件:

生成的3个文件,TypeSafeDemo.dll其实和普通的混编方式是一样的,可以和以前数据类型转换的方式一样使用;而DemoTestIMultiply.dll和TypeSafeDemoNative.dll这2个一起使用,Matlab已经在内部将数据转换过程封装好了,直接使用即可。第一种方式就不演示了,直接演示如何用接口来计算乘法。

五、C#调用混编好的dll计算结果。在上一节中我们已经说明了几个dll的作用,下面将演示他们的用法,将DemoTestIMultiply.dll和TypeSafeDemoNative.dll一起复制到测试项目的C#项目中去(新建一个控制台测试项目),分别添加这几个dll的引用:MWAarray.dll和DemoTestIMultiply.dll以及TypeSafeDemoNative.dll。然后添加命名空间,具体核心代码如下所示:


 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 using MathWorks.MATLAB.NET.Arrays;
7 using MathWorks.MATLAB.NET.Utility;
8
9 using TypeSaftDemo;
10
11 namespace TypeSaftTest
12 {
13 class Program
14 {
15 static void Main(string[] args)
16 {
17 //混编接口类的实例化
18 DemoTestIMultiply di = new DemoTestIMultiply();
19 double[,] a = new double[2,2] {{1,2},{3,4} };
20 double[,] b = new double[2, 2] { { 6, 7 }, {8, 9 } };
21 //分别演示接口的3种不同调用
22 var t1 = di.multiply(3, 5);
23 var t2 = di.multiply(new double[] { 1, 2, 3 }, 5);
24 var t3 = di.multiply(a, b);
25 Console.WriteLine("2个数直接相乘:"+t1.ToString());
26 Console.Write("数组与单个数直接相乘:");
27 foreach (var item in t2 ) Console.Write(item.ToString()+" ");
28 Console.WriteLine();
29 Console.Write("矩阵乘法:");
30 foreach (var item in t3) Console.Write(item.ToString() + " ");
31 Console.ReadKey ();
32 }
33 }
34 }

结果如下图所示:

  上面就是Matlab和C#基于接口的混合编程的详细过程,混编是一个很有用的工具,但要用好,其实真的很难,接触混编这么长的时间以来,碰到过很多同学使用这个工具,绝大部分是误用,导致无故的工作量。要想混编成为自己工作和学习的得力助手,必须加强Matlab和.NET基础的学习,只有2者的基础掌握好了,足够熟悉这2个平台,你才可能更顺利的解决混编过程中遇到的问题。当混编出了问题的时候,需要很多经验才能度过难关,这一点很重要,不要指望学会这个过程,就可以解决所有问题。期待Mathworks公司对Matlab的混编编程支持越来越强大。

4.相关资源

1 Matlab Builder NE具箱的User’s Guide栏目中的Type-Safe Interfaces, WCF, and MEF

2 Loren Shure 博客:

http://blogs.mathworks.com/loren/2011/06/03/introducing-type-safe-apis-with-builder-ne/

http://blogs.mathworks.com/loren/2011/06/30/multiple-inputs-and-outputs-in-builder-ne-type-safe-apis/

Matlab与.NET基于类型安全的接口混合编程入门,码迷,mamicode.com

时间: 2024-10-14 21:42:34

Matlab与.NET基于类型安全的接口混合编程入门的相关文章

【5.1送礼】国内第一部Matlab和C#.Net混合编程入门级视频教程【完全免费】

上一次写博客很久了,一直在忙彩票分析系统架构的事情,写博客真是件费神的事情,非常花时间.今天抽空发布这篇博客,是为了开源一部自己录制的视频教程-Matlab和C#.Net混合编程视频教程[入门级].下面说说这部视频教程的来由和一些事情,想获取的仔细看看,别忘了点[推荐]哦! 一.为啥要开源 1.1 视频的来源 这部视频教程是在2012年年底闲时比较多,当初也是很多朋友,网友提出这个Matlab.Net混合编程入门比较难,没有资料,所有就特意录制了一部比较简单的视频教程.并有条件的对广大网友免费开

【新年送礼】国内第一部C#.Net调用Matlab进行混合编程的视频教程【彻底免费无注册码】

其他混合编程文章 1[原创]Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码) 2.[原创]Matlab.NET混合编程技巧之——找出Matlab内置函数 3.[原创]Matlab与.NET混编解决人脸识别问题 4.[原创]Matlab与.NET基于类型安全的接口编程入门 5.[原创分享]Matlab.NET混编调用Figure窗体 一.视频说明 2014年的5.1,我将这套视频教程进行了免费下载,免费注册开放:[5.1送礼]国内第一部Matlab和C#.Net混合编程

Matlab与.NET混合编程解决人脸识别问题

原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 http://www.cnblogs.com/asxinyu/archive/2013/04/14/3020813.html [原创]Matlab与.NET基于类型安全的接口编程入门 http://www.cnblogs.com/asxinyu/archive/2013/05/16/3082299.ht

【目录】Matlab和C#混合编程文章目录

本博客所有文章分类的总目录链接:http://www.cnblogs.com/asxinyu/p/4288836.html 1.Matlab和C#混合编程文章目录 1.国内第一部C#.Net调用Matlab进行混合编程的视频教程[彻底免费无注册码] 2.国内第一部Matlab和C#.Net混合编程入门级视频教程[完全免费]  3.[原创]Matlab与.NET混编解决人脸识别问题  4.[原创]Matlab与.NET基于类型安全的接口编程入门   5.[原创]Matlab.NET混编调用Figu

iOS混合编程之使用Swift+Objective-C调用WebService

最近由于项目的需要,要使用Swift语言开发个iOS项目,某个简单的需求就是要调用远程的WebService数据.问题出现了,网上有很多使用OC调用WebService的例子,但是几乎没有找到使用Swift调用WebService的例子,我苦苦搜索了好几个小时,就是没有满足我要求的,怎么办,项目要泡汤了?Swift和OC,我该怎么选择? 天无绝人之路,还好Swift和OC可以完美的实现混合编程,可以相互实现调用.然后又在网上找到一个使用OC访问WebService的例子http://my.osc

[转] Matlab与C++混合编程(依赖OpenCV)

作者 [email protected],原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的Mex工具将C++的代码编译成 Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C++编写的.实现了交流无国界, 没有江山一统的谁,只有四海之内皆兄弟的豪气.另一方面,取C++所长补己之短.Matlab擅长矩阵运算,但对循环操作的效

Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)

原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之--找出Matlab内置函数中,已经大概的介绍了matlab内置函数在混合编程中的优点,并通过程序找出了matlab中的大部分内置函数,当然更多人关心是如何像我所说得那样,不用直接编译,就直接在C#中调用这些内置函数.本文就带你揭开这些谜团. 声明,这篇文章是需要一点点混合编程基础的,基本概念和过程要懂一点,如果能简单成功混编一个简单的计算或者绘图例子

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++混合程序

Matlab C混合编程

由于看的代码里面以及一些工程需要涉及一些Matlab 混合编程,一直想看一下,首先一个就是使用C编写代码,编译之后由Matlab调用,这需要用到Mex函数,mex程序就是根据一定的接口规范(mtlab提出的)编写的一个dll,Mex文件既可以用c,也可以用fortran来编.本文介绍的是用C编写的. 这样做,若是代码中有循环的话,使用matlab的话需要循环解释多次,而使用C语言编译成dll之后,首先可以将循环体放入二进制程序中,利用matlab加快运算,而不是循环解释执行matlab代码.还有