在Matlab做如下设置后
mbuild -setup
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n? y
Select a compiler:
[1] Lcc C version 2.4.1 in E:\APPLICATIONS\MATLAB71\sys\lcc
[2] Microsoft Visual C/C++ version 7.1 in C:\Program Files\Microsoft Visual Studio .NET
[0] None
Compiler: 2
Please verify your choices:
Compiler: Microsoft Visual C/C++ 7.1
Location: C:\Program Files\Microsoft Visual Studio .NET
Are these correct?([y]/n): y
Try to update options file: C:\Documents and Settings\WangGang\Application Data\MathWorks\MATLAB\R14SP3\compopts.bat
From template: E:\APPLICATIONS\MATLAB71\BIN\win32\mbuildopts\msvc71compp.bat
Done . . .
–> ""E:\Applications\MATLAB71\bin\win32\mwregsvr" "E:\Applications\MATLAB71\bin\win32\mwcomutil.dll""
DllRegisterServer in E:\Applications\MATLAB71\bin\win32\mwcomutil.dll succeeded
–> ""E:\Applications\MATLAB71\bin\win32\mwregsvr" "E:\Applications\MATLAB71\bin\win32\mwcommgr.dll""
DllRegisterServer in E:\Applications\MATLAB71\bin\win32\mwcommgr.dll succeeded
键入:comtool
却不能正常编译.
提示找不到"iostream"
我又重新添加了C++的类库
在mbuild -setup
按上面的步骤设置
再用comtool编译时 成功的编译出来并在C#环境中成功的调用
下面是具体的例子:
主要步骤如下:
1.建一个m文件(test.m)
例如:
function test(h,D)
for x=-10:0.1:10,
if x>D
y=h;
hold on;
plot(x,y)
elseif x<-D
y=-h;
hold on;
plot(x,y)
else
y=h/(D*x);
hold on;
plot(x,y)
end
end
2.在matlab中输入comtool命令,就打开了matlab com builder,
点击file-new project,新建一个工程,
在component name里输入名字 点击ok就行了。
然后点击project–Add files,将test.m添加入工程,
然后点Build-Com Object,就会在comtest\distrib\文件夹下生成一个test1_0.dll(它就
是做好的com组件),
Build时matlab已经自动将此dll在注册表中注册
我们还需做一个准备工作,进入<matlabroot>/ bin/win32目录下(matlabroot为你机器上
matlab安装的路径),打regsvr32 mwcomutil.dll ,即对mwcomutil.dll进行注册(这个dll
是matlab下作的任何com组件都要用到的dll),下面 我们在其他编译器下调用时就可以用了
。
3.c#下实现调用
新建一个c#项目(我采用的是),选中右边的解决方案资源管理器中的引用
,点鼠标右键,选添加引用,在弹出来的窗口中选com,然后也找到test_1_0 .dll,点选
择,然后确定就可,此时此com组件也添加到工程里面去了,同样我们可以选择 然后编写程序
test.testclassClass st=new test.testclassClass();
object m=1,n=2;
st.test(m,n);
即可
然后在c#中就出现了我们所想得到的图形,呵呵
归类于:未分类 — gentil @ 5:22 pm评论(0)
MATLAB外部程序接口实现方法研究
引言
Mat lab是一种以矩阵和阵列为基本编程单元的科学工程计算语言,它提供了功能齐全的数学函数和各种工具箱,在矩阵运算、数值计算、数值信号处理、系统识别、神经网络、图像语音处理等许多方面得到了广泛的应用。Matlab的计算功能非常强大,即使是复杂的计算程序,开发效率也很高,其主要缺点是执行速度比较慢。在解决实际问题时,往往利用matlab实现矩阵运算等计算过程,其他语言工具再通过与matlab的接口调用计算过程,返回结果。这样,就可以将其他语言灵活高效的编程能力和matlab强大的计算能力有机结合起来。
1 Matlab接口的实现方法介绍
其他语言与Matlab接口的实现有多种方法,下面介绍四种常见的方法。
1.1利用文件传递数据
利用文件传递数据是一种简单、方便的方法。实际使用中,可以使用文本文件、dat文件等文件来传递数据。如果用二进制数据文件传递数据,要注意Matlab与其他语言中二进制数据所占用的字节数以及输入输出所对应得格式要相匹配。
这种方法可以把M文件编译成可独立执行的EXE文件,这个EXE文件通过读入其他语言中用于传递数据的文件的数据,经过计算后,将结果放到文件中,然后其他语言读出文件中的数据。这样,就可以避免在其他语言中进行复杂的数值计算。
1,2利用ActiveX技术
ActiveX是由Microsoft制定的一种独立于编程语言的组件集成协议,它不受开发环境的限制。ActiveX空间能够在不同的环境中使用,包括VC、Delphi、c++ builder等。可以利用自动化服务器和自动化控制器技术,实现matlab和其他语言的接口。
1.3利用Mideva平台
Mideva是Mathtools公司推出的一种matlab编译开发软件平台,是一个强大而完备的M文件解释和开发环境,它通过应用Matcom和实时编译技术而达到快捷的速度。该软件平台有为Borland c++、Visual basic和Delphi等编程语言开发的不同版本。Mediva具有编译转换功能,能够将matlab函数或编写的matlab程序转换为c++形式的DLL,然后在Delphi中调用动态库函数,这样就可能实现对matlab各种工具箱的调用。同时,Mediva提供了上千个基本功能函数,包括基本操作、命令等,通过必要的设置,就可以直接实现与其他语言的混合编程,而不必依赖matlab环境,前提是必须要有两个动态链接库mdv4300.dll和ago4300.dll。
1.4利用com组件技术
com是component object module的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用。Matlab6.5新推出的com builder就是把matlab下的程序做成com组件,供其他语言调用。
matlab com builder在编译生成com组件的时候需要借助于外部的编译器。因为并不是所有的编译器都能生成和microsoft相兼容的com组件。com builder目前支持下列编译器:Borland c++ builder,Microsoft Visual Studio 6.0, Microsoft Visual Studio .net等。设置matlab com builder所使用的外部编译器,可以通过在matlab的commandwindow中输入命令MBuilder-setup来实现编译器的设置,具体步骤只要按照matlab提示进行即可。
2 matlab的com builder 使用方法
我们先将一个图片放入c盘下,命名为1.jpg,再准备一个测试文件test.m,如下:
%读入并且显示图片
function rs_jpg
I=imread(‘c:.jpg);
Imshow(I);
然后,在matlab的workspace下输入comtool,就可以启动matlab com builder环境。点击工具栏上的File菜单下的new project新建一个工程,在component name栏里填上comtest,将classes栏里自动生成的comtest类删除,class name里填上一个testclass。compile code in选c或c++都可以,不过因为c性能较好,推荐选择c。如果使用matlab里的图形库,需要在compiler options中选中Use Handle Graphics Library,我们使用了图形功能,故选中该项。选中Build debug version会生成调试版本的com组件,在调试的时候,调试版本的com组件如果真有错误发生,就会有相应得错误提示信息,可以方便地定位错误发生的地方。选中Show ……可以在编译生成com组件的时候输出详细的过程信息。在工程创建制后,仍然可以通过菜单Project->setting…打开此窗口进行修改。
Matlab下可以给com组件中的类添加方法。具体操作如下:
使用菜单Project->Add File或者点击按钮Add File添加已经存在的m函数文件就可以了。在这里,我们点击Project->Add files,将test.m添加如工程。方法(函数)添加完后,就可以使用菜单Builde->Com Object或者按钮build进行编译。编译完后就会在matlab工作目录下的comtest目录下生成两个文件夹:一个是srv,里面存放一些中间文件;另一个是distrib,里面就是动态链接库形式的com组件文件等。在这里,编译后distrib\文件夹下生成一个comtest_1_0.dll,这就是做好的com组件。
3 调用com组件的方法
3.1 vb下实现调用
打开或者新建一个vb工程,点击project->reference,在弹出的窗口中找到comtest 1.0 Type Library,将左边的复选框选中,点击ok,此时便将此com组件添加到工程里了。
示意调用代码如下:
Dim testclass As testclass
Set testclass1=New testclass
Call testclass1.rs_jpg
3.2 c#.net下实现调用
打开或者新建一个c#项目(这里采用),选中右边的解决方案资源管理器中的引用,点鼠标右键,选添加引用,在弹出窗口中选com,然后也找到comtest_1_0.dll,选择并确定即可。
示意调用代码如下:
omtest.testclasstestclass1=newcomtest.testclass();
testclass1.rs_jpg();
3.3 vc下实现调用
点击vc下的tools->ole/com objectviewer打开oleviewer工具,在oleviewer工具的右边选择type libraries,找到comtest 1.0 type library,选中并且右键,选择view,点save按钮,分别保存为comtest_1_0.h和comtest_1_0.c(也可以存为comtest_1_0.idl接口文件),我们就可以根据这两个文件实现对comtest_1_0.dll调用。
新建或打开一个vc工程,将comtest_1_0.h和comtest_1_0.c加入工程,并复制一个comtest_1_0.dll到工程目录下,由于comtest_1_0.dll还要用到mwcomutil.dll,所以将<matlabroot>
/extern/include/下的mwcomutil.h和mwcomtypes.h也加入工程中。
示意调用代码如下:
#import “mwcomutil.dll”
#import “comtest_1_0.dll”
#include “mwcomutil.h”
#include “comtest_1_0.h”
//初始化调用com
if (FAILED(CoInitialize(NULL)))
{
AfxMessageBox(“unable to
initialize COM”)
}
testclass *testclass1=NULL;
HRESULT hr=CoCreateInstance(CLSID_testclass, NULL,CLSCTX_ALL,IID_ testclass,(void**)&st);
if (SUCCEEDED(hr))
{
st->rs_jpg();
AfxMessageBox(“succeed”);
st->release();
}
else
{
AfxMessageBox(“unsucceed”);
}
3.4 delphi下实现调用
点击delphi的project->import type library…,出现图形窗口,找到testclass 1.0 type library,然后点击”install…”按钮,就在testclass控件页上安装了testclass控件。
打开或建立一个工程,在form上放一个testclass控件和一个按钮控件,然后在按钮相应事件中添加如下代码:
Procedure TForm1.Button1Click(Sender:TObject);
Begin
Testclass1.rs_jpg;
End;
4 打包
在matlab下的workspace里输入comtool,选择菜单flile->open project打开我们建好的工程文件comtest.cbl,再选择菜单component->package component就实现了打包。此时,可以在comtest\distrib文件夹里看,生成的comtest.exe就是打包后的解压程序,双击就会解压出一些文件,再点击解压出来的install.bat就可以实现安装。
5 结束语
通过应用编程接口,可以把其他高级语言灵活多变的编程能力和matlab的强大计算能力结合起来。matlab的com builder工具可以方便地把matlab程序做成com组件,为系统开发人员提供了简单、易用地应用程序接口。和其他接口方法相比,将matlab程序做成com组件,使其他语言工具和matlab的混合编程更加简单。
参考文献
[1]韩守红等.Delphi与Matlab接口的实现方法研究.微计算机信息.2001
[2]胡劲松等.基于COM的MATLAB与Delphi混合编程研究.计算机应用研究.
归类于:未分类 — gentil @ 5:16 pm评论(0)
VC++与Matlab混合编程的研究与实现(收集整理)
Matlab是Mathworks公司推出的数学软件,它将数值分析、矩阵计算、信号处理和图形显示结合在一起,包含大量高度集成的函数可供调用,命令语句功能十分强大,为科学研究、工程设计及众多学科领域提供了一种简洁、高效的编程工具。但是Matlab使用的是解释性语言,大大限制了它的执行速度;源代码的公开不利于算法和数据的保密;局限于Matlab运行环境而不能用于开发商用软件。Visual C++是Windows平台下主要的应用程序开发环境之一,它能方便实现软件开发,开发的系统具有界面友好、执行速度快、易维护和升级等优点。但是在工程计算方面,和Matlab相比编程显得复杂的多。因此实现VC与Matlab混合编程,使两者结合起来,协同工作,必将提高软件开发效率,使所开发的软件具有更高的性能,更大的应用范围,也可以为科学研究和工程技术提供更强的技术支持。
VC与Matlab混合编程的实现方案
在VC环境中调用Matlab程序主要有以下几种方法:
(1)用Matlab引擎,采用客户机/服务器(Client/Server)的计算模式。在VC中设计程序框架,作为前端客户机,通过调用Matlab引擎与后台Matlab服务器建立连接,实现命令和数据信息的传递。这种方式需要Matlab在后台运行,离不开Matlab环境。不利于软件的开发,但是它可以充分利用Matlab的功能,包括调用工具箱函数和图形函数。
(2)用Matlab的编译器将.m源文件转化为c、c++等各种不同类型的源代码,并在此基础上根据应用需要生成MEX文件、独立可执行应用程序等文件类型,大大提高程序的运行速度,提高代码的执行效率。主要是使用mcc命令实现文件的转化。但是这种方法不支持图形函数,不能编译一些Matlab的内建函数,并且转换的代码可读性不太好。
(3)使用Matcom编译器可以将Matlab源代码译成同等功能的C++代码,既保持了Matlab的优良算法,又提高了执行速度。它还支持一定的图形显示,生成代码的可读性很好。因其简单便捷、功能强大、应用灵活,本文主要探讨这种实现方案。
实现VC与Matcom的接口步骤
Matcom是Mathworks公司推出的第一个由Matlab到C++的编译开发软件平台,它的可视化界面,方便丰富的调试功能和对数学库的强大支持受到广大技术人员的重视。现在的最高版本为Matcom4.5。
我们可以通过在Matcom中file菜单下的compile to exe or dll调用.m文件编译,在Matcom的debug目录下找到生成的cpp、exe、dll文件。把需要的文件加到VC开发环境的工程中,再包含头文件就可以实现调用。也可以直接在VC环境下使用科学运算库,即Matcom的Matrix<LIB>,它是按照Matcom的语法在VC中实现类似于Matlab函数的方法。但是这里还有一种将Matcom集成到VC环境的方法,即安装Visual Matcom的方式,这种方式操作更加简便易行,只需要熟悉Matlab编程,经过简单的步骤就可以轻松实现VC环境中调用Matlab。下面介绍Visual Matcom开发环境的安装。
(1)拷贝<matcom45>\bin\usertype.dat文件(<matcom45>指Matcom的安装路径)到<visual c++>\Common\MSDev98\Bin目录(<visual c++>指VC的安装路径)下。
(2)运行Visual C++,从菜单条中选择Tools/Customize/Add-ins and Macro Files,选择Browse,改变文件类型为Add-ins(.dll),选定<matcom45>\bin\mvcide.dll文件,确定。
(3)这样,可以在Visual C++的开发环境中看到一个如图1所示的Visual Matcom工具栏,表明安装成功。
图1 Visual Matcom工具栏
下面以一个线性方程组的求解过程为例,介绍通过Matcom实现VC对Matlab程序的调用,运行环境:Win2000、Matlab6.1、Matcom4.5、Visual C++6.0
(1)Matlab运行环境中编写程序equation.m,其代码如下:
%equation 求解线性方程组的解
%线性方程组形如:A*X = B
function X = equation(A, B)
X = A\B;
(2)这里以一个简单的控制台程序为例,其它程序基本相同。
在VC环境中建立一个名为Test的Win32 Console Application工程。
(3)点击Visual Matcom工具栏上的m++图标,选择保存过的Matlab文件equation.m进行转化。如果看到的转化信息提示没有错误就可以观察到此时在FileView标签中多了m-files,C++files created from m-files,Matrix<lib>等文件。并且该工程目录下增加了equation.h,equation.cpp,equation.mak,equation.r等的4个文件。这时会在VC中出现一个转换完毕的文件,文件中如果报告有错误就要考虑是否程序有问题,可以双击C++files文件夹下的equation.m进行修改,再重新转化直到没有错误报告为止。
(4)在Test工程下建立一个文件test.cpp调用转化的Matlab函数,代码为:
#include "stdio.h"
#include "matlib.h" //提供转化后C++代码中使用的数据类型,函//数原型及常数
#include "equation.h"
void main()
{
/*解线性方程组:
X =
*/
initM(MATCOM_VERSION); //初始化matlib库
Mm a,b,x; //使用矩阵类Mm构造矩阵a,b,x.
a = (BR(1),2,3,semi,4,5,6,semi,7,8,1);
//给矩阵a赋值,BR是Matrix<LIB>库的一个
//宏,用于定义一个矩阵的开始;semi是库的//一个常量,用于分隔不同行的矩阵元素
b = zeros(3,1); //初始化矩阵b为零矩阵3行1列
b(1,1) = 37; b(2,1) = 85; b(3,1) = 69; //给矩阵b赋值
x = equation(a,b); //调用转化的函数,求解线性方程组的解
for (int i = 1; i <= x.rows(); i++) //把解矩阵X的元素显示出来
{
for (int j=1;j<=x.cols();j++)
printf("x(%d,%d)=%f\n",i,j,x.r(i,j));
}
exitM(); //结束对matlib库的调用
return;
}
注意:程序中涉及到了两个成员函数.rows()和.cols(),它们分别返回矩阵的行数和列数;x.r(i,j)代表矩阵x的第i行第j列的元素。
(5)编译运行后结果为x(1,1) = 3.000000 x(2,1) = 5.000000 x(3,1) = 8.000000与实际结果一致。
总结:如果需要转换的.m文件不是一个函数,只是一些Matlab命令的集合,则要在工程目录下找到转换文件的.cpp文件,将其中的C代码拷贝到需要调用它的函数里面。Matcom克服了mcc命令只能编译一个独立.m文件的缺点,当所编译的.m文件依赖于其他.m文件时,只要把被调用的.m文件与要编译的.m文件放在同一目录下,生成的被调用文件的.h和.cpp文件插入到VC开发的工程中就可以了。
上面只是一个简单的控制台工程的例子,我们也可以建立其它类型的工程,只要在需要调用转换后函数的程序中包含matlib.h并且在响应函数中初始化matlib库initM(MATCOM_VERSION);结束调用后做结束工作exitM();就可以了。
结束语
本文讨论了VC与Matlab的混合编程,主要集中讨论在VC中调用Matlab的实现方案。通过一个Matcom编译实现的例子我们看到,利用Visual Matcom转换代码非常方便,生成的代码可读性好,而且还支持多数图形函数,基本上使Matlab和VC能够得到充分的发挥。作者在海洋遥感图像处理中使用这种方法来提高程序的执行速度,取得了非常理想的效果。它不仅解决了Matlab的解释执行方式带来的执行速度过慢的缺陷,更重要的是它完全脱离了Matlab系统,当代码被编译成可执行程序后,又可大大提高程序的安全性。
归类于:未分类 — gentil @ 5:12 pm评论(0)
终于实现c#调用matlab函数(ZZ)
.net是微软的发展方向,以后我们开发软件的时候不免会调用一些matlab语言
今晚一直在***图用c#调用matlab,终于成功。
主要思想就是首先把matlab的m函数做成com组件,然后在c#中应用此com组件,即可。
主要步骤如下:
1.建一个m文件(test.m)
例如:
function test(h,D)
for x=-10:0.1:10,
if x>D
y=h;
hold on;
plot(x,y)
elseif x<-D
y=-h;
hold on;
plot(x,y)
else
y=h/(D*x);
hold on;
plot(x,y)
end
end
2.在matlab中输入comtool命令,就打开了matlab com builder,
点击file-new project,新建一个工程,
在component name里输入名字 点击ok就行了。
然后点击project–Add files,将test.m添加入工程,
然后点Build-Com Object,就会在comtest\distrib\文件夹下生成一个test1_0.dll(它就
是做好的com组件),
Build时matlab已经自动将此dll在注册表中注册
我们还需做一个准备工作,进入<matlabroot>/ bin/win32目录下(matlabroot为你机器上
matlab安装的路径),打regsvr32 mwcomutil.dll ,即对mwcomutil.dll进行注册(这个dll
是matlab下作的任何com组件都要用到的dll),下面 我们在其他编译器下调用时就可以用了
。
3.c#下实现调用
新建一个c#项目(我采用的是),选中右边的解决方案资源管理器中的引用
,点鼠标右键,选添加引用,在弹出来的窗口中选com,然后也找到test_1_0 .dll,点选
择,然后确定就可,此时此com组件也添加到工程里面去了,同样我们可以选择
然后编写程序
test.testclassClass st=new test.testclassClass();
object m=1,n=2;
st.test(m,n);
即可
然后在c#中就出现了我们所想得到的图形