asp.net matlab,ASP.NET与MATLAB混合编译以及数据传递【更新中】

本帖最后由 yinbo20081314 于 2015-5-20 00:35 编辑

在VS环境的项目中,首先需要引用以下dll才能开启MATLAB混编。【引用1】MatlabApplication(Version 8.1) Type Library 1.0

7d717e780d60c41ddfa4d93ff0439d6c.png

a1.jpg (42.85 KB, 下载次数: 9)

2015-5-20 00:16 上传

【引用2】

在MATLAB安装地址下可以找到MWArry.dll:

MATLAB\R2013a\toolbox\dotnetbuilder\bin\win32\v2.0

【在程序环境中添加命名空间】

Using MLApp;  //引用1中使用

Using MathWorks;  //引用1中使用

Using MathWorks.MATLAB; //引用1中使用

UsingMathWorks.MATLAB.NET.Arrays; //引用2中使用

Using MathWorks.MATLAB.NET.Utility; //引用2中使用

方法1是混合编程的方式,我用32位系统的matlab2013a+VS2013可以成功实现,其他配置可以参考MATLAB的官网介绍,下边也会说到。引用1的方法能够直接在C#环境下将MATLAB命令传递给MATLAB,并且将结果返回。如果要做一个在线MATLAB控制平台,倒是可以考虑这个方法。但是引用1也有巨大的局限性,那就是无法调用自定义的function。方法2与方法1刚好相反,能够将自己编写的FUNCTION编译成C#直接调用的类来使用。

【MATLAB准备工作】安装MATLAB编译器要到MATLAB安装路径下找到toolbox\compiler\deploy\win32,安装“MCRInstaller.exe”就好。不同版本的MATLAB有他相对应的编译器,一定要保证程序与此编译器的版本一致。

【使用方法1】

需要在【引用1】的前提下进行

Using MLApp;  //引用1

Using MathWorks;  //引用1

Using MathWorks.MATLAB; //引用1复制代码

例1:

MLApp.MLAppClass matlab = new MLApp.MLAppClass();

String command=”这里填写MATLAB执行语言”;

string state_ddu=matlab.Execute(command);

matlab.Quit();

matlab = null;

Label2.Text = state_ddu;复制代码

例2:

MLApp.MLAppClass matlab = new MLApp.MLAppClass();

string command = @"M=imread('C:\Users\Administrator\Desktop\aaa.jpg');" +

@"N=imread('C:\Users\Administrator\Desktop\bbb.jpg');" +

"I=rgb2gray(M); " +

"J=rgb2gray(N);" +

"[Count1,x]=imhist(I);" +

"[Count2,x]=imhist(J);" +

"Sum1=sum(Count1);" +

"Sum2=sum(Count2);" +

"Sumup = sqrt(Count1.*Count2);" +

"SumDown = sqrt(Sum1*Sum2);" +

"Sumup = sum(Sumup);" +

"HistDist=1-sqrt(1-Sumup/SumDown);" +

"HistDist";

string state_ddu = matlab.Execute(command);

matlab.Quit();

matlab = null;

Label2.Text = state_ddu;复制代码

例3:

MLApp.DIMLApp matlab = null;

Type matlabAppType = System.Type.GetTypeFromProgID("Matlab.Application");

matlab = System.Activator.CreateInstance(matlabAppType) as MLApp.DIMLApp;

matlab.Visible = 1;

matlab.Execute("figure(2)");复制代码

例4:

MLApp.MLApp matlab = null;

Type matlabAppType = System.Type.GetTypeFromProgID("Matlab.Application");

matlab = System.Activator.CreateInstance(matlabAppType) as MLApp.MLApp;

matlab.Visible = 1;

string command = "figure(3)";

matlab.Execute(command);复制代码

例5:

MLApp.MLApp O_matlab = new MLApp.MLApp();

O_matlab.Visible = 0;

string command1, command2;

command1 = "t=0:0.01:2*pi;y=sin(t);h=plot(t,y)";//matlab脚本命令行

command2 = @"figure(1)";

O_matlab.Execute(command1);

O_matlab.Execute(command2);        // 执行Matlab命令

O_matlab.Quit();复制代码

评价:MLApp的使用特点就是直接生成MATLABAPP类,调用内部函数进行计算,并且将计算结果利用execute事件返回。缺点是暂时无法实现自定义函数的使用。目前不可以带有自定义函数的代码存在。

【使用方法2】

这个方法的最大特点就是可以将函数function编译成类,供VS直接调用。

准备):一般应该是MATLAB版本比VS高,从而使得MATLAB可以支持VS的使用,具体的匹配可以详见下面的mathwork链接:

MathWorks中关于软件编译支持的软件

http://cn.mathworks.com/support/compilers/R2013a/index.html

http://cn.mathworks.com/support/compilers/R2015a/?s_cid=srchtitle

如果版本安装匹配,在MATLAB会找到VS编译器,如果不合适是不会找到VS编译器的。

这里介绍的是C#环境下的编译,因此步骤1可以省略。

步骤1)(C#下非必需):>>mbuild-setup

3cf26d5dd9ce8708fbcfd28e32ef9a27.png

a2.jpg (39.89 KB, 下载次数: 18)

2015-5-20 00:17 上传

步骤2):

准备好自己的function,下面以makeSqr(n)为例

function out=makeSqr(n)

out=magic(n);

end复制代码

步骤3):

>>deploytool复制代码

如图所示输入工程名称为Demo,target选择.NETAssembly

546a014da6599b5ca2123b521fed85ce.png

a3.jpg (31.09 KB, 下载次数: 25)

2015-5-20 00:20 上传

步骤4):

命名一个类MLTestClass,添加M文件makeSqr.m。

c2c7cc9e5efb44d1cc5de4615b732866.png

a4.jpg (40.43 KB, 下载次数: 22)

2015-5-20 00:20 上传

如果需要可以在setting中修改命名空间名称,使得命名空间与工程名称相互区分;其他的设置功能可自行设置。

c668f6d47098969d6707eebdef558bbe.png

a5.jpg (53.31 KB, 下载次数: 16)

2015-5-20 00:21 上传

完成之后,点击build进行编译。若编译成功会如下显示。

2da95a8e25f1a71686150e76624164f5.png

a6.png (40.23 KB, 下载次数: 22)

2015-5-20 00:22 上传

在生成的demo/distrib中会有4个文件,我们需要用到demo.dll。其中demoNative.dll和demo.dll是功能一致的,有网友实验说demoNative.dll会比demo.dll块一点,我测试过觉得也就快一点点,具体哪里的区别有待继续学习。Demo_overview.html算是使用说明,与【引用2】所述是一样的。

65dff0d91d47567eeedd9f6747f37f27.png

a7.png (159.4 KB, 下载次数: 18)

2015-5-20 00:23 上传

步骤5):打开一个web网站,利用【引用2】中的提示添加引用MWArray.dll。再添加编译好的demo.dll,如图所示:

af3353381fd00a23f54e46af6a1ac420.png

a8.png (86.21 KB, 下载次数: 17)

2015-5-20 00:23 上传

在命名空间中输入

using com.demo;

using MathWorks.MATLAB.NET.Arrays;

using MathWorks.MATLAB.NET.Utility;复制代码

触发程序中输入:

MLTestClass obj = null;

MWNumericArray input = null;

MWNumericArray output = null;

MWArray[] result = null;

try

{

obj = new MLTestClass();

input = 5;

result = obj.makeSqr(1, input);

output = (MWNumericArray)result[0];

}

catch (Exception)

{

throw;//需要修改

}复制代码

步骤6):

Output并不是简单的结果,其中包含了关于结果的全部信息。如果output是一个矩阵,需要toarray()将其进行转换为数组。另一个例子:

double[,] myResult = (double[,])output.ToArray();

EXenergy1.Text = Convert.ToString(myResult[0, 0]);复制代码

注意):

MATLAB矩阵A与C#数组myResult[,]一一对应,只要注意下下标即可。

A=[1,2,3,4;

5,6,7,8];

myResult[0,0]=1;

myResult[1,3]=8;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01背包 模板1 2 总结

物品质量 w[0] w[1] w[2] ....... w[n] 背包容量c T 物品价值 v[0] v[1] v[2] ....... v[n] 物品种类 n N (一)设DP(x,y) 表示 从前x项物品中 取出装入 体积为y的背包 的 物品的最…

matlab暂停音频,matlab 中的实时音频

matlab 中的实时音频音频系统工具箱™针对实时音频处理进行了优化. audioDeviceReader, audioDeviceWriter, audioPlayerRecorder,dsp.AudioFileReader 和 dsp.AudioFileWriter 器是为流式传输多通道音频而设计的, 它们提供了必要的参数, 以便您可以在吞吐量和延迟之间进行权衡…

js数组操作

2019独角兽企业重金招聘Python工程师标准>>> 1、数组的创建 var arrayObj new Array(); //创建一个数组 var arrayObj new Array([size]); //创建一个数组并指定长度,注意不是上限,是长度 var arrayObj new Array([element0[, element1[…

用webstorm自动编译less产出css和sourcemap

css产出sourcemap有什么用呢,可能大家要问这个问题了。 请移步这里 https://developers.google.com/chrome-developer-tools/docs/css-preprocessors?hlzh-CN 在chrome中我们通过sourcemap可以直接调试less源文件文件,这是一个非常强大的功能。 下面由我…

远近旋转球体

2019独角兽企业重金招聘Python工程师标准>>> static int day 20; void mydisplay(void) {int a clock();glEnable(GL_DEPTH_TEST);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清空颜色缓存与深度缓存glMatrixMode(GL_PROJECTION);//接下来要进行的操作…

iOS开发UI篇—CALayer简介

一、简单介绍在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本标签、一个文本输入框、一个图标等等,这些都是UIView。 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层,在创建UIVi…

php 多进程 常驻内存,PHP 多进程与信号中断实现多任务常驻内存管理 [Master/Worker 模型]...

本文章基于pcntl扩展做的多进程测试。进程调度策略父子进程的调度由操作系统来负责,具体先调度子进程还是父进程由系统的调度算法决定,当然可以在父进程加上延时或是调用进程回收函数pcntl_wait可以先让子进程先运行,进程回收的目的是释放进程…

RPG的错排

RPG的错排 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 25 Accepted Submission(s) : 14 Problem Description今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道…

读取properties

为什么80%的码农都做不了架构师?>>> //db 是文件名为db.properties private static final ResourceBundle bundle ResourceBundle.getBundle("db");public static String getProperties(String key){return bundle.getString(key);} 转载于:…

Java 8新特性(二)

2019独角兽企业重金招聘Python工程师标准>>> 集合类的批处理: Java8除了Lambda表达式外还提供了另一个重要的特性,即集合的批处理操作,集合类的批处理操作API的目的是实现集合类的“内部迭代”,并期望充分利用现代多核…

Python 支付宝支付代码

2019独角兽企业重金招聘Python工程师标准>>> #!/usr/bin/env python # encoding: utf-8Created on 2011-1-5 author: codebackgmail.comimport hashlib import urllib2verfyURL{"https":"https://www.alipay.com/cooperate/gateway.do?servicenotif…

Linux驱动开发必看详解神秘内核(完全转载)

Linux驱动开发必看详解神秘内核完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.htmlIT168 技术文档】在开始步入Linux设备驱动程序的神秘世界之前,让我们从驱动程序开发人员的角度看几个内核构成要素,熟悉一些基本的内核概…

python计算机视觉2:图像边缘检测

我是一名初学者,如果你发现文中有错误,请留言告诉我,谢谢 如果需要检测到图像里面的边缘,首先我们需要知道边缘处具有什么特征。 对于一幅灰度图像来说,边缘两边的灰度值肯定不相同,这样我们才能分辨出哪里…

oracle12c多个pdb,ProxmoxVE 之 oracle12C 多CDB和PDB

上面左边是我的个人微信,如需进一步沟通,请加微信。 右边是我的公众号“Openstack私有云”,如有兴趣,请关注。继上次在PVE环境上搭建了oracle12C RAC环境(请参考博文“ProxmoxVE 之 安装oracle12C rac集群”)并且安装使用CDB和PD…

postgresql调优

http://blog.pgaddict.com/posts/performance-since-postgresql-7-4-to-9-4-pgbench硬件和系统配置操作系统Ubuntu13.04系统位数64CPUIntel(R) Core(TM)2 Duo CPU内存4G硬盘Seagate ST2000DM001-1CH164测试工具PostgreSQL-9.1.11测试工具工具名称pgbench数据量200W(…

操作系统--进程状态切换以及cpu调度(转)

http://www.cnblogs.com/coder2012/p/3204730.html 进程的状态转换 进程在运行中不断地改变其运行状态。通常,一个运行进程必须具有以下三种基本状态。 进程状态 执行态run:进程正在使用CPU等待态wait:进程正在等待I/O完成,不在使…

在Exchange 2010中重建Exchange安全组

问题:有时候,重新安装Exchange 2010会corrupt掉Exchange安全组,或者出现重复的组。用户在这种情况下会出现访问被拒的情况。分析:我们可以删掉这些安全组,然后最这些安全组进行重建:当你prepare ad的时候,由于OtherWel…

带弹出列表的EditText

最近做的一个Andriod里有一个这个要求,一个东西需要输入,但同时可以在列表直接选择。看到这个需求,瞬间想到了QQ的登录界面,那个账号输入的控件正式我所需要的。 这个账号输入框右边有一个按钮,点击可以显示一个下拉列…

获取win7时区所有信息

打开命令行工具: tzutil /l# 或者输入到文件中tzutil /l > data.txt 1 # -*- utf-8 -*-2 3 """获取win7所有时区信息,并写入到sql语句中4 5 Usage: python data.py -f data.txt -o data.sql6 """7 8 if __name__ &quo…

linux kill命令信号,Linux kill 命令详解

Linux kill 命令很容易让人产生误解,以为它仅仅就是用来杀死进程的。我们来看一下 man page 对它的解释:kill - send a signal to a process.从官方的解释不难看出,kill 是向进程发送信号的命令。当然我们可以向进程发送一个终止运行的信号&a…