Category Archives: Matlab

matlab的combuilder系列2-后期补充

接1 后期补充:   六.vc中的数组和com中的VARIANT变量的相互转换(By capriccio,感谢) 用一个例子说明一下, 首先用matlab的m文件描述一下例子中com组件的功能: function y=hehe(x) y=x*2; 把该文件保存为hehe.m   用combuilder中建立工程comparatest,加入类paratest, 然后加入文件hehe.m,再build成为com组件。   下面是vc中的代码: #include "stdafx.h" #include "stdio.h" #import "mwcomutil.dll" #import "comtest2_1_0.DLL" #include "mwcomutil.h" #include "comtest2_1_0.h"   #include "comutil.h"       int main(int argc, char* argv[]) {         double a[4]={1,2,3,4};         int i=4;         if(FAILED(CoInitialize(NULL)))  //初始化调用com         {          printf("unable to initialize COM");         }         VARIANT x,y;         VariantInit(&x);         VariantInit(&y);         x.vt=VT_R8|VT_ARRAY;//声明x的类型为VT_ARRAY,                         //Array中的元素为double型         SAFEARRAYBOUND rgsabound[1];         rgsabound[0].cElements=4;//元素的个数         rgsabound[0].lLbound=0;  //矩阵索引的下界 … 繼續閱讀

发表在 Matlab | 2条评论

matlab的combuilder系列1

  摘要:这篇文章于2003年5月21日发表在水木清华mathtools版,当时版面讨论matlab的混合编程异常火爆。而当时matlab里的combuilder还是个新鲜事物,这篇文章是我摸索好几天得到的成果,后期也有些改进。   matlab的combuilder系列-matlab下做com组件      com builder是matlab6.5才有的,也是mathworks公司推荐使用于混合编程的,这些日子我对他进行了全方位的摸索,感觉是爽呆了,下面我们一起来揭开它的神秘面纱,^_^。      此系列分为以下几块:      1.matlab下做com组件      2.vb,c#.net实现调用      3.vc实现调用      4.打包      5.优缺点评注 其中2,3部分可以选择一个看 有什么问题请发到邮箱: dkf03@mails.tsinghua.edu.cn,也可以上smth,ID:xxhn,bbfrog 后期补充: 6.vc中的数组和com中的VARIANT变量的相互转换(By capriccio) 7.vb,.net中的数组和com中的VARIANT变量的相互转换 8. Matlab与VC混合编程 (用idl或dll来调用com组件) 9.combuilder与vc混编中复数类型的输出(By LPCTSTR)     一.matlab下做com组件      com是component object module的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现 调用它。matlab6.5新推出来的combuilder就是把matlab下的程序做成com组件,供其他语言调用。      我们先准备两个测试文件,并copy一个图片到c盘下,起名叫1.jpg(这些你都可以改的,我这儿是为了程序方便) … 繼續閱讀

发表在 Matlab | 1条评论

s函数诠释

摘要:主要介绍自己摸索S函数的一些体会,原文于2003年5月7日发表在水木清华mathtools版,当时写总结上瘾了。   这是我摸索s函数的一些心得,与大伙分享。        s函数是system Function的简称,用它来写自己的simulink模块。(够简单吧,^_^,详细的概念介绍大伙看帮助吧)可以用matlab、C、C++、Fortran、Ada等语言来写,这儿我只介绍怎样用matlab语言来写吧(主要是它比较简单)    先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API等的    先介绍一下simulink的仿真过程(以便理解s函数),simulink的仿真有两个阶段:第一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束。    在matlab的workspace里打edit sfuntmpl(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构。它的第一行是这样的:function [sys,x0,str,ts]=sfuntmpl(t,x,u,flag)先讲输入与输出变量的含义:t是采样时间,x是状态变量,u是输入(是做成simulink模块的输入),flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);sys输出根据flag的不同而不同(下面将结合flag来讲sys的含义),x0是状态变量的初始值,str是保留参数(mathworks公司还没想好该怎么用它,嘻嘻,一般在初始化中将它置空就可以了,str=[]),ts是一个1×2的向量,ts(1)是采样周期,ts(2)是偏移量。 下面结合sfuntmpl.m中的代码来讲具体的结构:switch flag,                  %判断flag,看当前处于哪个状态  case 0,    [sys,x0,str,ts]=mdlInitializeSizes;flag=0表示处于初始化状态,此时用函数mdlInitializeSizes进行初始化,此函数在sfuntmpl.m的149行我们找到他,在初始化状态下,sys是一个结构体,用它来设置模块的一些参数,各个参数详细说明如下    size = simsizes;%用于设置模块参数的结构体用simsizes来生成    sizes.NumContStates  = 0;%模块连续状态变量的个数    sizes.NumDiscStates  = 0;%模块离散状态变量的个数    sizes.NumOutputs     = 0;%模块输出变量的个数    sizes.NumInputs      = 0;%模块输入变量的个数    sizes.DirFeedthrough = 1;%模块是否存在直接贯通(直接贯通我的理解是输入能直接控制输出)    sizes.NumSampleTimes = 1;%模块的采样时间个数,至少是一个    sys … 繼續閱讀

发表在 Matlab | 2条评论

matlab的stateflow(状态流)简单应用--做一个计数器

 摘要:主要内容如题所示,讲matlab里面的stateflow的应用,于2003年4月24日发表在水木清华mathtools版。写这篇文章的初衷是有网友问起这方面的情况,然后手就痒了^0^   精华区里只有关于stateflow的英文介绍,再加上前几天有网友问我怎么用它,我就拿我以前用stateflow做的计数器来简单介绍一下stateflow的用法,希望能够抛砖引玉。    先介绍一下stateflow,从matlab的help中翻译过来的,stateflow要与simulink一起使用,他是一个用来在控制和管理中设计和开发逻辑图的工具(翻的不好,请大家见谅)。从我的理解来说,stateflow就是用来作状态流图的,可以用它设计一些状态和各个状态之间的转换条件,然后放在simulink中仿真。    说了这么多,我的手痒起来了,还是动手做吧,^_^。     一.打开simulink,新建一个model(保存为time.mdl),在simulink的左边找到stateflow并选中他,将右边的chart拖入新建的model中,双击这个chart,就出现了stateflow的编辑器,先介绍一下这里面能画的东东(在左边的工具栏上)    1.左边工具栏上第一个图标是方框似的东东,将它拖入编辑器中,就表示一个状态(state),双击它就可以在其中写一些命令,格式如下(%后面的是我自加的,方便解释):        name/                                   %此状态的名称        entry:entry action                      %刚转换到此状态时执行entry action        during:during action                    %在此状态之中时执行during action        exit:exit action                        %退出此状态时执行exit action        on event_name:on event_name action      %当某事件发生时执行on event_name action    2.左边工具栏上第二个图标是一个圆中有个H的东东,它的名字叫做历史节点(History Junction) ,可将他拖入一个状态框中(就是上面说的那个),一旦一个状态框中有这个历史节点,在退出这个状态时会将这个状态的一些信息保存下来,当下次再进入此状态时,此状态的初始状态就会是前面保存过的那些信息。    3.左边工具栏上第三个图标是一个一根线指向一个方框的东东,叫默认转换(default transition),把他拖到一个状态的旁边,它就会指向一个状态,表示系统启动后将首先进入这个状态。    4.左边工具栏上第四个图标(他的样子太复杂了,不描述了,反正是最后一个,呵呵)代表的东东,叫节点(Junction),它是方便画状态图的,当各个状态之间的转换很复杂时,可以设立中间节点,将一些相同的转换指向它,然后再由它指向各个状态(或另一个中间节点)    5.还得介绍一下画转换线(transition),将鼠标放在一个状态的旁边,当它变成+形状的时候,按下左键不动,就会拉出一条线来,当拉到另一个状态旁边时松开左键,这样就画出了一条由一个状态指向另一个状态的转换线,选中这条线,将鼠标停留在上面,鼠标会变成一个I的样子,这时按下鼠标,就可以在上面写语句,例:switch(switch事件使状态转换)或[output>maxtime](当此条件满足时进行状态的转变)。     二.再介绍一下stateflow是怎样跟simulink通讯的,在stateflow编辑器中点tool菜单下的explore,在左边支开time,选中chart,我们将在此添加一个事件和两个数据(计数器所需要的)。    1.点Add菜单下event,在右边就新产生了一行,将它的名字(name)改成switch,范围(scope)改成input from simulink,触发器形式(Trigger)改成Rising(其实这儿无所谓),此时你看看time.mdl,是不是chart模块上方多了一个上升的标志,此时在time.mdl添加一个pulse generator(在simulink\sources里面),将他的输出接到chart的上方,就表示每当pulse generator产生的信号上升时,switch事件发生。    … 繼續閱讀

发表在 Matlab | 发表评论

matlab的Virtual Reality(虚拟现实)工具箱的应用简介

摘要:这篇文章是当上水木清华mathtools版斑竹后写的第一篇长文章^_^,原文发表于2003年4月20日。主要内容是用一个小例子介绍matlab的虚拟工具箱:)      这几天钻在mathtools里,发现讨论区和精华区里都没有这个工具箱的讨论,所以我想尽我所能介绍一下虚拟现实工具箱在matlab中的应用,也算是上任板斧来带给大家的第一个好东东。    先介绍一下虚拟现实,从虚拟现实版面精华区摘过来的,所谓虚拟现实(vitual reality),是指采用各种技术,来营造一个能使人有置身于真正的现实世界中的感觉的环境。也就是要能使人产生和置身于现实世界中相同的视觉,听觉,触觉,嗅觉,味觉等。目前的研究还主要集中在前面三项,主要是第一项,它具有五大特征:   (1)立体感的视觉效果(2)存在感(3)多感知性(4)闭环交互方式(5)动态显示    matlab的虚拟现实工具箱就是让我们在matlab下虚拟现实,为什么非得在matlab下用呢?这是因为可以利用matlab和simulink的强大功能来操作三维实体的位置、角度等等。 说了这么多,还是举个小例子吧。我们来做一个三维的小球运动的虚拟现实:第一步当然是先做准备了:安装三维实体的制作器和浏览器    matlab自带了三维实体制作器和浏览器,安装步骤如下:在workspace下打 vrinstall -install viewer   %安装浏览器,matlab会提示你是选择OpenGl加速还是Direct3d加速,按o或d选择选择完后,会出现blaxxun Contact viewer的安装程序,将它装上就可再打vrinstall -install editor  %安装制作器,用vrinstall -install会将两者都装上可以用命令vrinstall -check检查是否安装成功 第二步:制作一个包含小球的三维模型打开<matlab root>\toolbox\vr\vrealm\program\vrbuild2.exe  %<matlab root>为matlab安装的路径然后ctrl+N(点file菜单下的new也可以,表示新建一个三维实体),选中左边的New world,然后点击工具栏上图标为一个球的按钮,即添加了一个小球(你也可以添加其他的),将左边的transform改成ball(名字而已),此时你可以看到它下面有一些center、rotation、scale、scaleOrientation、translation等等,这些就是matlab下可以控制的(下一步将介绍)。此时你可以修改这个小球的大小,位置,颜色等。还可以添加一些其他的三维实体,像灯光、fog、背景、视角等等。这儿就不介绍了,随便你们怎么玩吧。此时点击保存,这儿我保存为ball.wrl,wrl文件是vrml格式(vrml格式其实就是跟html一样,一种固定格式,只是面对的对象不同,你可以用文本编辑器看看它的格式) 第三步:终于可以用matlab虚拟现实了,^_^,爽阿这里主要介绍在simulink虚拟现实,打开simulink,新建一个model,在其中加入一个VR Sink模块(在Virtual Reality ToolBox下)双击它,在左边的source file旁点击browse,选中我们第二步做的ball.wrl,然后点击右下角的apply按钮,看看,右边的root下是不是多了一个ball,将它展开,选中translation(平移,这里我们主要在simulink控制他),再点ok,可以看到VR Sink多了一个输入口,旁写着ball.translation,呵呵,没错,就是我们刚才选中的translation,你可以在属性窗口中多选中几个,就可以多控制几个。translation是平移坐标,分x,y,z,即在x、y、z轴上的平移。在model中加一个mux(simulink–signal routing下,改Number of input为3)、Ramp(x轴上平移)、Sine Wave(y轴上按sin函数移动),constant(z轴不动)(后三个模块都在simulink—source下),将Ramp、Sine Wave、Constant三个模块分别接上mux的三个输入(由上而下),mux的输出接VR Sink的输入了。嗯,整个系统搭接完成,可以运行了,好紧张阿.双击VR Sink模块,在左边的source files旁边点击view(这将你小球实体显示了出来,6.5下是一个浏览器,6.1是一个网页),然后在新建的model下点击运行,看看,我们的小球是不是正在跳舞呢,^O^,你可以自己设计小球的运动曲线,只需修改输入就可以了。 virual … 繼續閱讀

发表在 Matlab | 1条评论