C#与Matlab(com组件的生成!)也可以在C++ VB上应用
一、引言MATLAB是一个功能强大、具有良好交互性的科学及工程计算软件,它提供相当丰富的
工具箱,使用户能非常有效地计算或模拟各种科学及工程问题。自从20世纪90年代以来,
MATLAB软件已经成为应用代数、自动控制理论、数理统计、数字信号处理、时间序列分
析和动态系统仿真等课程的基本的教学工具,成为学生必须掌握基本软件之一。
C#是Microsoft的Visual Studio开发环境支持的一种语言,它结合了C++和VB的优点,是
一种“现代”的编程语言,但是它的数学计算能力要落后于MATLAB。
COM组件则是有别于传统的一种新型软件构架。COM技术解决的一个基本问题就是如
何设计一个系统使得不同软件开发商在不同的时间和地点开发的代码能够协同操作及共享
二进制代码。
二、实现原理
MATLAB的COM编译器是MATLAB编译器的一个扩展功能,能够把一个或多个M方程
转换、编译成COM组件。MATLAB的COM编译器是利用MATLAB编译器把MATLAB程序
转换成C/C++代码,在调用外部的C++编译器来编译产生COM组件。
为了实现在C#中调用MATLAB计算程序,实现C#与MATLAB的混合编程,下面我们将
以具体的实例来详细讲解如何实现C#2005与MATLAB R2007a的混合编程。
三、C#2005与MATLAB R2007a接口的具体实现过程
①、C/C++编译器的安装
首先在MATLAB的在命令窗口(Command Window)里面键入:mbuild –setup回车后提
示:“Would you like mbuild to locate installed compilers /n?”, 输入n。因为它是问你是否
要建立本地已安装的编译器(MATLAB自带的编译器),这里要用的是.NET里面的编译器。
然后就是选择编译器,选择Microsoft Visual C++ 2005 就好了(C++ 2005和C# 2005同在.NET
2005平台下)。
现在又会出现如下问题:“The default location for Microsoft Visual C++ 2005 compilers is
C:\Program Files\Microsoft Visual Studio 8, but that directory does not exist on this machine. Use
C:\Program Files\Microsoft Visual Studio 8 anyway /n?” ,如果你的C#安装在了C 盘默认目
录下,键入y(yes)就好。否则就键入n;假如你安装在了D盘,输入n 后提示你为:Please enter
the location of your compiler: :这样你就可以在后
面直接输入你的C#的安装路径了如:D:\Program Files\Microsoft Visual Studio 8,最后它又问
你:Are these correct? (/n): 输入y 即可!最后就是生成两个Dll(动态链接库)文件一个
是mwcomutil.dll,一个是mwcommgr.dll。如果你的上述步骤有错误,就不会生成这两个文件。
经过以上步骤就把MATLAB配置好了。
下面我们来书写一个MATLAB程序(程序必须是函数文件)。例如书写一个绘制关于x
和y的多项式曲线的小程序,程序具体如下:
function draw (formula)
pp=figure (1);
ezplot (formula);
grid on;
print (pp,'-dbitmap','C:\draw'); %%把图像保存;
close (pp); %%关闭图像;
②、MATLAB COM组件的生成
在MATLAB命令窗口里面键入:deploytool(这和MATLAB以前的版本不同),回车会出
现如图(1)所示的窗口。根据提示,要新建一个“工程”,单击新建按钮,会出现如图(2)
所示的窗口,因为C#是在.NET下的,就选择MATLAB Builder for .NET和Generic COM
Component,在下面Name项里面输入名称,Location里面选择存储路径。如输入的名称为:
draw,路径为默认。进入下一步,如图(3)点击添加文件按钮(Add Files),找到刚才保存的
MATLAB的.m 文件添加。最后点击执行按钮(Build the Project),MATLAB会自动生成一个
**.dll(draw_1_0.dll)文件(已经自动注册过)。这样COM组件就生成了。
file:///C:/DOCUME%7E1/wqs/LOCALS%7E1/Temp/moz-screenshot.jpg
③、书写C#代码
先打开一个新的解决方案Integral。在资源管理器里的引用项里右击添加引用如图(4),
在COM项里面找到刚才所生成的**.dll(draw_1_0.dll)项,确定。然后简单设计一个窗口,
用来提示操作如图(5)。在窗口的Textbox里面输入关于x的多项式,点击“查看图形按钮”
后,在Picturebox里面就会显示所输入的关于x和y的多项式的图像。其中主要代码如下:
private void DrawingImage()
{
string formula = textBox1.Text;
draw.drawclass draw_1 = new draw.drawclass(); //声明新对象;
draw_1.draw(formula); //绘图
}
private void button1_Click(object sender, EventArgs e)
{
try
{
//先要释放Image中的所用资源;
if (pictureBox1.Image != null) { pictureBox1.Image.Dispose(); }
//调用draw方法有生成一个新的图像
this.DrawingImage();
//把生成的图像显示在窗口中的picturebox中;
pictureBox1.Image = System.Drawing.Image.FromFile(@"C:\draw.bmp");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message,"提示");
}
至此,就完成了C#中调用MATLAB程序的全过程。可在写好的程序里面试验一下,例
如在Textbox里面输入:x^2 + y^3 = 24,点击查看图形按钮就可以看到图形了
四、总结
上面我们实现了C#2005与MATLAB R2007a的接口问题,这样我们在编程过程中既可以
应用C#强大的编程能力,又可以使用C#调用由MATLAB程序生成的COM组件,大大增强所
编软件的计算能力。但需要注意的是:
1、如果我们所书写的MATLAB程序有返回值,而在C#中调用生成的COM组件时,类
里面的函数是无返回值(void)的,它把MATLAB函数的返回值以输入参数的形式
返回。如:sqrt.Sqrt(1, ref ret,num1); sqrt是类的对象,Sqrt就是函数名,第一个参数
1表示有一个返回值,ref ret表示要返回的值,num1就是要输入的参数。
2、并不是所有的MATLAB函数都能被转换成C/C++代码,所以这些函数的MATLAB
程序也不能被编译成COM组件。如sym,syms。
3、这种MATLAB产生COM组件的方法只适用于MATLAB7.1以后的版本。
此文章为小弟 自己所做 有什么不对的地方请多多指教!! Matlab生成com组件的关键一部:::
(5)打包组件以及MCR,在以前的操作中生成的com组件只能在当前的计算机上使用,为能勾把它发布到其他的计算机上使用还需要其他一些文件的支撑 另外com组件不同于普通的dll文件com组件必须注册以后才能在计算机上应用选择Components-->package components命令 comtool将会把它发布该组件所需要的文件打包到一个和工程同名的可执行文件!
[ 本帖最后由 无水1324 于 2009-4-20 08:34 编辑 ]
求楼主!!!
楼主想问一个问题,你在帖子最后写道如果我们所书写的MATLAB程序有返回值,而在C#中调用生成的COM组件时,类
里面的函数是无返回值(void)的,它把MATLAB函数的返回值以输入参数的形式
返回。如:sqrt.Sqrt(1, ref ret,num1); sqrt是类的对象,Sqrt就是函数名,第一个参数
1表示有一个返回值,ref ret表示要返回的值,num1就是要输入的参数。
我想问一下com组件的返回值怎么赋给其他变量,我是个新手,最近要做个东西,给卡在这里了,希望你能帮帮我,谢谢了
我的邮箱xingfengfengleo@126.com
[ 本帖最后由 xingfengfengleo 于 2009-4-27 19:29 编辑 ]
返回值的问题
我们就定义一个简单的m程序文件function a=Sqrt(b)
a=sqrt(b);
生成com组件后在vs中调用:
其调用程序代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace MAX
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if(this.textBox1.Text==null)
{
}
else
try {
string str1 = textBox1.Text;
double num1;
object ret=null;
num1 = double.Parse(str1);
Sqrt.Sqrtclass sqrt = new Sqrt.Sqrtclass();
sqrt.Sqrt(1,ref ret,num1);
label3.Text = ret.ToString();
}
catch (Exception ss)
{
MessageBox.Show(ss.ToString(),"提示",MessageBoxButtons.OK);
}
}
}
}
此程序可以说明变量的调用的问题!!
[ 本帖最后由 wqsoooooooooo 于 2009-4-30 18:58 编辑 ]
页:
[1]