📄 view.htm
字号:
pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"
type="application/x-shockwave-flash" width="102" height="70"></embed>
</OBJECT></TD></TR>
<TR>
<TD colSpan=2 height=3></TD></TR></TBODY></TABLE>
<TABLE
style="BORDER-RIGHT: #666666 1px solid; BORDER-TOP: #666666 1px solid; BORDER-LEFT: #666666 1px solid; WIDTH: 95%; BORDER-BOTTOM: #666666 1px solid"
height=21 cellSpacing=0 cellPadding=0 width="95%" bgColor=#e3e3e3 border=0>
<TBODY>
<TR>
<TD align=right><SPAN title=帮助及常见问题><A
href="http://bbs.matwav.com/html/help.html" target=_blank>帮助</A></SPAN> |
<SPAN title=全文检索><A href="http://bbs.matwav.com/post/search">搜索</A></SPAN>
| <SPAN title=定制个人属性><A
href="http://bbs.matwav.com/user/edit">个人属性</A></SPAN> | <SPAN
title=退出论坛><A href="http://bbs.matwav.com/user/logout"
target=_parent>注销</A></SPAN> | <SPAN title=标记所有新帖为已读><A
href="http://bbs.matwav.com/user/markread" target=_parent>标记已读</A></SPAN>
| <SPAN title=我最新参与的文章><A
href="http://bbs.matwav.com/user/myforum">我的论坛</A></SPAN> | <SPAN
title=发帖最多的用户,回复最多的话题,人气最旺的话题><A
href="http://bbs.matwav.com/stat/top">排行榜</A></SPAN> | <SPAN
title=按每月、日、周以及小时的帖子数统计><A
href="http://bbs.matwav.com/stat/analysis">发帖统计</A></SPAN>
<BR></TD></TR></TBODY></TABLE><BR clear=all>
<SCRIPT language=javascript>
function copyText(obj) {
var rng = document.body.createTextRange();
rng.moveToElementText(obj);
rng.scrollIntoView();
rng.select();
rng.execCommand("Copy");
rng.collapse(false);
}
</SCRIPT>
<TABLE cellSpacing=0 cellPadding=2 width="95%" border=0>
<TBODY>
<TR>
<TD><B><FONT face=arial size=3><B>»</B></FONT> <A class=nav
href="http://bbs.matwav.com/index.html"><B>研学论坛</B></A> <FONT
face=arial size=3><B>»</B></FONT> <A class=nav
href="http://bbs.matwav.com/post/page?bid=12&sty=1&age=30&tpg=1"><B>matlab/maple/mathematica</B></A>
<BR><BR><IMG alt=按打印兼容模式打印这个话题 src="view.files/icon_print.gif"
align=absMiddle border=0> <A class=mod title=按打印兼容模式打印这个话题
href="http://bbs.matwav.com/post/print?bid=12&id=80109"><B>打印话题</B></A>
<IMG alt=把这个话题寄给朋友 src="view.files/icon_friend.gif"
align=absMiddle border=0> <A class=mod title=把这个话题寄给朋友
href="http://bbs.matwav.com/post/forward?bid=12&id=80109&done=%2Fpost%2Fview%3Fbid%3D12%26id%3D80109%26sty%3D1%26tpg%3D1%26age%3D30"><B>寄给朋友</B></A>
<IMG alt=该主题的所有更新都将Email到你的邮箱 src="view.files/icon_watch.gif"
align=absMiddle border=0> <B><FONT color=#c0c0c0>订阅主题</FONT></B>
</B></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=2 width="95%" border=0>
<TBODY>
<TR>
<TD align=right><A
href="http://bbs.matwav.com/post/reply?bid=12&parent=80109&done=%2Fpost%2Fview%3Fbid%3D12%26id%3D80109%26sty%3D1%26tpg%3D1%26age%3D30"><IMG
alt="reply to topic" src="view.files/newreply.gif" align=absMiddle
border=0></A><IMG alt="flat mode" src="view.files/flat_d.gif"
align=absMiddle border=0><A
href="http://bbs.matwav.com/post/view?bid=12&id=80109&tpg=1&ppg=1&sty=3&age=30#80109"><IMG
alt="threaded mode" src="view.files/threaded.gif" align=absMiddle
border=0></A><A
href="http://bbs.matwav.com/post/view?bid=12&id=80109&tpg=1&ppg=1&sty=1&age=30&prev=1"><IMG
alt="go to previous topic" src="view.files/prev.gif" align=absMiddle
border=0></A><A
href="http://bbs.matwav.com/post/view?bid=12&id=80109&tpg=1&ppg=1&sty=1&age=30&next=1"><IMG
alt="go to next topic" src="view.files/next.gif" align=absMiddle
border=0></A> </TD></TR></TBODY></TABLE><A name=80109></A>
<TABLE cellSpacing=1 cellPadding=4 width="95%" bgColor=#000000 border=0>
<TBODY>
<TR class=head>
<TD align=middle width=150><FONT color=#ffffff><B>作者</B></FONT></TD>
<TD><FONT color=#ffffff><B>[共享]提高matlab运算速度的几种方法 [精华] </B></FONT></TD></TR>
<TR class=even>
<TD vAlign=top width=150><B>yagart</B> <BR><IMG
src="view.files/face_byhtsai_amuro.gif" border=0> <BR><BR><BR>论坛游民<IMG
src="view.files/advu.gif" border=0> <BR><BR><B>发贴:</B> 12 <BR><B>技术分:</B>
4 <BR><B>积分:</B>15 <BR><IMG height=1 src="view.files/pixel.gif" width=150
border=0> </TD>
<TD vAlign=top width="100%"><IMG src="view.files/post_n.gif"
align=absMiddle border=0>于 2004-08-18 00:36 <A
href="http://bbs.matwav.com/user/info?uid=14923"><IMG alt="user profile"
src="view.files/icon_profile.gif" align=absMiddle border=0></A><A
href="http://bbs.matwav.com/user/message?action=WriteMessage&to=yagart&subject=Re%3A%5B%B9%B2%CF%ED%5D%CC%E1%B8%DFmatlab%D4%CB%CB%E3%CB%D9%B6%C8%B5%C4%BC%B8%D6%D6%B7%BD%B7%A8"
target=_blank><IMG alt="send a private message to user"
src="view.files/icon_pm.gif" align=absMiddle border=0></A><A
href="http://bbs.matwav.com/post/reply?bid=12&parent=80109&done=%2Fpost%2Fview%3Fbid%3D12%26id%3D80109%26sty%3D1%26tpg%3D1%26age%3D30&quote=1"><IMG
alt="reply to post" src="view.files/icon_quote.gif" align=absMiddle
border=0></A><A
href="http://bbs.matwav.com/post/search?username=yagart&action=Search"><IMG
alt="search all posts by" src="view.files/icon_find.gif" align=absMiddle
border=0></A><A href="javascript:copyText(document.all.text80109);"><IMG
alt="select and copy to clipboard. ie only, sorry for netscape users:-)"
src="view.files/icon_copy.gif" align=absMiddle border=0></A><A
href="http://bbs.matwav.com/user/favorite?action=Add&bid=12&id=80109"
target=_blank><IMG alt="add this post to my favorite list"
src="view.files/icon_favorite.gif" align=absMiddle border=0></A>
<HR color=#000000 noShade SIZE=1>
<DIV align=right><IMG src="view.files/ratings2.gif" border=0> </DIV><SPAN
class=javascript
id=text80109>由于matlab是一种解释性语言,所以在matlab程序中最忌讳直接使用循环语句,如果不得已要使用for循环,可以采用以下方法提高速度。<BR>1、使用6.5以上版本,对循环已作优化;<BR>2、尽可能转化为矩阵运算;<BR>3、转化为二进制执行文件运算,如使用matlab内带的编译系统或matcom以及com组件技术。<BR><BR>其中com组件技术最方便的就是利用com
builder来实现,这里重点介绍。<BR>com
builder是matlab6.5才有的,也是mathworks公司推荐使用于混合编程的,这些日子进行了全方位的摸索,感觉是爽呆了,下面我们一起来揭开它的神秘面纱。<BR>此系列分为以下几块:<BR>1.matlab下做com组件<BR>2.vb,c#.net实现调用<BR>3.vc实现调用<BR>4.打包<BR>5.优缺点评注<BR>其中2,3部分可以选择一个看<BR><BR>matlab下做com组件<BR>com是component
object
module的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用它。matlab6.5新推出来的combuilder就是把matlab下的程序做成com组件,供其他语言调用。<BR>我们先准备两个测试文件,并copy一个图片到c盘下,起名叫1.jpg(这些你都可以改的,我这儿是为了程序方便):<BR>第一个叫im_test.m如下:<BR>function
im_test %这个文件不带输入与输出<BR>I=imread('c:\1.jpg');
%因为以前带有imshow的程序用mcc编成dll后用不<BR>%了,所以想试combuilder是否<BR>imshow(I);
%能支持这些函数<BR>第二个叫split2rgb.m,就是前些日子Zosco发给我的那个程序,因为它用mcc编成dll后有问题,所以我在这儿继续将它进行测试,而且它也带有多个输入及输出参数,所以也正好拿来测试<BR>在matlab的workspace下打comtool,就打开了matlab
com builder,点击file-new project,新建一个工程,在component name里填上comtest,Class
name里填上一个sgltest(并将自动生成classes里的comtest remove掉),complie <BR>code
in选c或c++都无所谓,将Complier options里的Use Handle Graphics
library的复选框画上,点击ok就行了。然后点击project--Add
files,将im_test.m和split2rgb.m添加入工程,然后点Build-Com
Object,就会在comtest\distrib\文件夹下生成一个comtest_1_0.dll(它就是做好的com组件),Build时matlab已经自动将此dll在注册表中注册,为了下面能用其他编译器调用,我们还需做一个准备工作,开一个dos窗口,进入<matlabroot>/bin/win32目录下(matlabroot为你机器上matlab安装的路径),打regsvr32
mwcomutil.dll,即对mwcomutil.dll进行注册(这个dll是matlab下作的任何com组件都要用到的dll),下面我们在其他编译器下调用时就可以用了。<BR>是不是觉得做起com组件来很简单呢,matlab下可以给com组件中的类添加成员、事件、方法等,我这儿其实是给类sgltest添加了两个方法,怎么添加成员和方法可以参看matlab的com
builder的帮助。<BR><BR>附录:split2rgb.m的源代码<BR>%%// 测试文件<BR>function
[m_nHeight,m_nWidth,mOrigR,mOrigG,mOrigB]=Split2RGB(FileName)<BR><BR>%%//
读入一个Jpg文件,<BR>mOrigData=imread(FileName);<BR>%mDestData=imresize(mOrigData,0.5);<BR>imwrite(mOrigData,'c:\2.jpg');<BR><BR>%%//
用三个变量保存其R,G,B分量<BR>mOrigR=mOrigData(:,:,1);<BR>mOrigG=mOrigData(:,:,2);<BR>mOrigB=mOrigData(:,:,3);<BR><BR>%%//
获得图象的高度,宽度<BR>[m_nHeight,m_nWidth]=size(mOrigR);<BR><BR>figure(1);<BR>set(gcf,'MenuBar','none')<BR>imshow(mOrigData);<BR>title(['Orginal
Image:',FileName],'Color','b','FontSize',14);<BR>xlabel(['Height:
',num2str(m_nHeight),' Width
:',num2str(m_nWidth)],'Color'<BR>,'b','FontSize',12);<BR><BR>%%//
写param文件<BR>paraFName=[FileName(1:length(FileName)-4),'.param'];<BR>fid=fopen(paraFName,'w');<BR>fwrite(fid,m_nHeight,'uint32');<BR>fwrite(fid,m_nWidth,'uint32');<BR>fclose(fid);<BR><BR>%%//
写 R
分量文件<BR>RFName=[FileName(1:length(FileName)-4),'_R.rot'];<BR>fid=fopen(RFName,'w');<BR>fwrite(fid,mOrigR,'uint8');<BR>fclose(fid);<BR><BR>%%//
写 G
分量文件<BR>GFName=[FileName(1:length(FileName)-4),'_G.rot'];<BR>fid=fopen(GFName,'w');<BR>fwrite(fid,mOrigG,'uint8');<BR>fclose(fid);<BR><BR>%%//
写 B
分量文件<BR>BFName=[FileName(1:length(FileName)-4),'_B.rot'];<BR>fid=fopen(BFName,'w');<BR>fwrite(fid,mOrigB,'uint8');<BR>fclose(fid);<BR><BR>这一部分讲vb,c#.net下怎么实现调用上一部分我们生成的comtest_1_0.dll(matlab下做的com组件),记得一定先要对mwcomutil.dll进行注册(怎么注册参看上一部分)<BR>1.vb下实现调用<BR>打开或新建一个vb工程,点project-Reference,在弹出来的窗口中找到comtest
1.0 Type
Library,将前面的复选框选上,点击ok,此时便将此com组件添加到工程里面去了,此时你可以用对象浏览器看到comtest下有个sgltest类,这个类里面有两个方法im_test,split2rgb,还有个MWFlags成员(这个成员是自动生成的),vb下测试代码如下:<BR>测试im_test方法的代码:<BR>Dim
st As sgltest<BR>Set st = New sgltest<BR>Call
st.im_test<BR>测试split2rgb方法的代码:<BR>Dim st As sgltest<BR>Set st = New
sgltest<BR>Dim h As Variant, w As Variant, r As Variant, g As Variant, b
As Variant, <BR>filename As Variant<BR>filename = "c:\\1.jpg"<BR>Call
st.split2rgb(5, h, w, r, g, b, filename)
<BR>可见matlab下函数的输入输出参数在com组件里全是variant型的变量,测试大获成功,结果就跟matlab下运行的一摸一样,爽<BR><BR>2.c#.net下实现调用<BR>打开或新建一个c#项目(我采用的是vs.net编辑器),选中右边的解决方案资源管理器中的引用,点鼠标右键,选添加引用,在弹出来的窗口中选com,然后也找到comtest_1_0.dll,点选择,然后确定就可,此时此com组件也添加到工程里面去了,同样我们可以选择对象浏览器来看comtest及下面的sgltest类,c#测试项目如下:<BR>测试im_test方法的代码:<BR>comtest.sgltestClass
st=new comtest.sgltestClass();
<BR>st.im_test();<BR>测试split2rgb方法的代码:<BR>comtest.sgltestClass st=new
comtest.sgltestClass(); <BR>object
h=null,w=null,r=null,g=null,b=null;<BR>object
filename="c:\\1.jpg";<BR>st.split2rgb(5,ref h,ref w,ref r,ref g,ref
b,filename);<BR>可见输入参数是ref
object型的,而输出参数是object型的,测试同样大获成功,与matlab下运行的结果一摸一样,爽呆了。<BR><BR>这一部分讲vc下实现调用第一部分我们生成的comtest_1_0.dll,同样要记得先对mwcomutil.dll进行注册(怎么注册参看第一部分),vb和.net下实现对com组件的调用很简单,而vc下实现这一步我可是摸索了好几天(主要是vc用的不好)<BR>1.先做一些准备工作,用ole
viewer工具开始--程序--Microsoft visual studio6.0--Microsoft visual studio6.0
Tools--OLE viewer(这个工具也可以通过在vc下点Tools--OLE/COM Object
Viewer来打开,在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调用<BR><BR>2.vc下调用<BR>新建或打开一个vc工程,注意,此时不用对编译器进行任何设置(而用mcc生成的dll我们么设置一大堆,我这儿只设置了Precomplied
headers,选Automatic use of precompliedheaders,写上
stdafx.h),将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也加入工程(将这两个文件拷贝入工程路径下,如果设置了library
path,可以不加)此时可以通过classView看到多出了_IID、IMWUtil,Isgltest类,Isgltest就是我们在matlab下建起来的sgltest类<BR><BR>vc下代码如下<BR>//这几个是引入dll和头文件<BR>#import
"mwcomutil.dll"<BR>#import "comtest_1_0.DLL"<BR>#include
"mwcomutil.h"<BR>#include "comtest_1_0.h"<BR>#include "comutil.h"
//此文件是用来处理由char
*向VARIANT类型的转换<BR>测试im_test方法的代码:<BR>if(FAILED(CoInitialize(NULL)))
//初始化调用com<BR>{<BR>AfxMessageBox("unable to initialize
COM");<BR>}<BR>Isgltest *st=NULL;
<BR>//创建一个com组件,CLSID_sgltest和IID_Isgltest可以从comtest_1_0.h和comtest_<BR>1_0.c里找到<BR>HRESULT
hr=CoCreateInstance(CLSID_sgltest,NULL,CLSCTX_ALL,IID_Isgltest,(voi<BR>d
**)&st);<BR>if(SUCCEEDED(hr))<BR>{<BR>st->im_test();
<BR>AfxMessageBox("succeed");<BR>st->Release();<BR>}<BR>else<BR>{<BR>AfxMessageBox("unsucceed");<BR>}
<BR>如果你的vc工程是console
project的话,上述的AfxMessageBox可改成printf或cout,测试split2rgb方法的代码(类型转换我参照visual
c的精华区也转换成功了)<BR>if(FAILED(CoInitialize(NULL)))<BR>{<BR>AfxMessageBox("unable
to initialize COM");<BR>}<BR>Isgltest *st=NULL; <BR>HRESULT
hr=CoCreateInstance(CLSID_sgltest,NULL,CLSCTX_ALL,IID_Isgltest,(voi<BR>d
**)&st);<BR>VARIANT
m,n,r,g,b,filename;<BR>VariantInit(&m);<BR>VariantInit(&n);<BR>VariantInit(&r);<BR>VariantInit(&g);<BR>VariantInit(&b);<BR>VariantInit(&filename);<BR>filename.vt=VT_BSTR;<BR>filename.bstrVal=_com_util::ConvertStringToBSTR("C:\\1.jpg");<BR>if(SUCCEEDED(hr))<BR>{<BR>st->split2rgb(5,&m,&n,&r,&g,&b,filename);<BR>st->Release();<BR>AfxMessageBox("succeed");<BR>}<BR>else<BR>{<BR><BR>AfxMessageBox("unsucceed");<BR>}
<BR>同样,运行结果与matlab下的结果一摸一样,记得我们的im_test里面可是使用了imshow阿,以前用mcc生成的程序中用它可是有错哦,爽呆了。<BR>关于VC下用com组件及其类型的转变请参看msdn及其Visual
C的精华区<BR><BR>combuilder系列可以结尾了<BR>一.打包:<BR>在matlab下的workspace里打comtool,点file-open
project将我们先前建好的comtest.cbl工程文件打开,再点component--package
component就实现了打包,此时到comtest\distrib文件夹里看,生成的comtest.exe就是打包后的解压程序,双击它会解压出一些文件,再点击解压出来的_install.bat就可以实现安装(按他的步骤去做就行了)<BR><BR>二.优缺点评注<BR>这几天用这个combuilder可把我给爽死了,特别是在vc下调用成功时,记得精华区里曾讲combuilder没有什么实质性的突破,我可不这么认为,它的突破可大了<BR>1.做出来的是com,通用的,任何编译器只要支持com,就可以实现调用,想c++
builder,Delphi等的,我想只要按照调用com组件去做,也能成功的<BR>2.支持imshow等一些原来混编用不了的函数,对图形库的支持也比以前强(这些还需各位大侠共同测试)<BR>3.实现方法简单,没有像以前混编还要设置一大堆东东<BR>4.能够在matlab下写自己的类,并为自己的类编写成员、方法和事件,管理工程也方便(这个有点像vc、vb下管理工程一样)用的太爽了,一下子还不知道怎么写缺点了,^0^,我想缺点还需大家一起用来找出我这儿说一个缺点,感觉它的参数全是VARIANT型的,不怎么方便。
</SPAN><BR><BR>
<DIV align=right>亚丁 edited on 2004-08-18 14:04
<BR></DIV><BR></TD></TR></TBODY></TABLE><A name=80177></A>
<TABLE cellSpacing=1 cellPadding=4 width="95%" bgColor=#000000 border=0>
<TBODY>
<TR class=head>
<TD align=middle width=150><FONT color=#ffffff><B>作者</B></FONT></TD>
<TD><FONT color=#ffffff><B>Re:[共享]提高matlab运算速度的几种方法 [Re:yagart]
</B></FONT></TD></TR>
<TR class=even>
<TD vAlign=top width=150><B>GEO</B> <BR><IMG
src="view.files/face_byhtsai_amuro.gif" border=0> <BR><BR><BR>论坛游民<IMG
src="view.files/advu.gif" border=0> <BR><BR><B>发贴:</B> 18 <BR><B>技术分:</B>
0 <BR><B>积分:</B>25 <BR><IMG height=1 src="view.files/pixel.gif" width=150
border=0> </TD>
<TD vAlign=top width="100%"><IMG src="view.files/post_n.gif"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -