-
2008-06-18
如何将曲线以不连续的形式画出来 - [MATLAB]
最近有些“忙”, blog也没有什么内容好更新。弄点简单的东西,凑个篇幅。
MATLAB中的数据,用plot画出来一般是一条连续的曲线,怎么用将它画成离散的形式呢?
例如下面的连续正弦曲线,怎么画成后面的离散形式呢?
这个方法很简单,这个上图中的连续曲线:
x = 1:100;
y = sin(x/20);
figure, plot(x,y);
不连续曲线:... -
2008-04-13
MATLAB中的正态分布检验 - [MATLAB]
要对一组样本进行正态性检验,在MATLAB中,一种方法是用normplot画出样本,如果都分布在一条直线上,则表明样本来自正态分布,否则是非正态分布。
MATLAB中也提供了几种更正式的检验方法:
kstest Kolmogorov-Smirnov 正态性检验,将样本与标准正态分布(均值为0,方差为1)进行对比,不符合正态分布返回1,否则返回0;该函数也可以用于其它分布类型的检验;
lillietest Lilliefor... -
2008-03-31
MATLAB中的一些小技巧(2) - [MATLAB]
1. Ctrl+D打开子程序
在MATLAB的Editor中,将输入光标放到一个子程序名称中间,然后按Ctrl+D可以打开该子函数的m文件。当然这个子程序要在路径列表中(或在当前工作路径中)。实际上该快捷键对应右键菜单中“Open Selection”命令。
2. 列出依赖函数
在Editor菜单中,选择Tools->Show Dependency ... -
2008-03-25
MATLAB 中GUI子程序的参数传递 - [MATLAB]
MATLAB 中GUI子程序的参数传递
输入参数传递:
比如子GUI的名称为subGUI, 设想的参数输入输出为:[out1, out2] = subGUI(in1, in2)
在subGUI的m文件中(由GUIDE自动产生):
1.第一行的形式为:function varargout = subGUI(varargin)
该行不用做任何修改;varargin 和 varargout 分别是一个可变长度的cell数组(MATLAB帮助文件... -
2008-02-19
MATLAB中的一些小技巧 - [MATLAB]
MATLAB中的一些小技巧
1. Ctrl+C 中断正在执行的操作
如果程序不小心进入死循环,或者计算时间太长,可以在命令窗口中使用Ctrl+c来中断。MATLAB这时可能正疲于应付,响应会有些滞后。
2. figure命令新建一个绘图窗口
figure 可以打开一个空的绘图窗口,接下的绘图命令可以将图画在它里面,而不会覆盖以前的绘图窗口。当有多个figure窗口时,在命令窗口中执行如Plot等命 令将覆盖当前figure... -
2007-08-16
爱国者MP3的录音文件导入MATLAB时一点问题 - [MATLAB]
想对动物的叫声做一下频谱分析,正好手边有爱国者的一款MP3可以录音,就录了下来。但是分析时出了问题,这个MP3的wav文件不能直接导入到MATLAB中,而Windows中的Sound Recorder录的却可以。后来发现这两个wav的文件头不一样。我用以下方法解决这个问题:<
><
> (1)用Windows附件中的Sound Recorder打开爱国者的录音WAV文件,选择另存为,在Format中选择参数PCM,8KHz,8bit,单声道Mono,假定文件名为aigo.wav; (2) 用Sound Recorder录一个文件,以相同的格式保存,如pc.wav; (3)用十六进制编辑软件(如PSPad,A.X.E.等)打开这两个文件,在pc.wav中找到fact这四个字符,注意在aigo.wav中也有这几个字符,只是位置不一样。用pc.wav中fact前面的内容覆盖aigo.wav中fact前面的内容。保存之后就可以了。<
><
> 我用的爱国者mp3录音的精度是4bit,而第一步中转换到8bit,对数据的影响应该不大。 -
2007-07-01
MATLAB中的GUI程序:选取曲线极大值 - [MATLAB]
这是我正在做的小波模态参数识别程序中的一个模块,由于功能比较独立,所以单独拿出来共享一下。
程序的运行界面如图所示,可以手动或自动地从曲线中选择出极值点,也可以对极值点的列表进行修改。
需要从命令行调用:
peaks = select_freq(xscale,curve);
其中:xscale:曲线的横坐标;
curve:曲线的幅值;
peaks:极值点在curve中的位置。
手动选择极值点时,对红色光标线两侧的10个点取最大值,不用担心光标对不准的问题。
自动选择可以将阀值以上的极值点一次取出,自动和手动方法可以结合起来使用。
由于是针对我的程序编制的模块,所以调用的自由度不高,如横坐标和纵坐标的名称等。不过这些在程序中也可以很方便地修改。也可以根据需要对该程序进行修改,实现类似的功能。
点击这里下载:下载地址。
-
2007-04-25
MATLAB如何从GUI中返回参数 - [MATLAB]
(本文为Liuxqsmile原创,转载请保留原文链接)在研学论坛上看到有人问这个问题,把方法在这里重新贴一下:在GUI子程序的OpeningFcn函数的结尾加上uiwait(handles.figure1); figure1是子GUI的Tag;子GUI中控制程序结束(如"OK”和"Cancel"按钮)的callback末尾加上uiresume(handles.figure1),不要将delete命令放在这些callback中;在子GUI的OutputFcn中设置要传递出去的参数,如 varargout{1} = handles.par1;varargout{2} = handles.par2;末尾添加 delete(handles.figure1); 结束程序。在GUI的OpenFcn中,如果不加uiwait, 程序会直接运行到下面,执行OutputFcn。也就是说程序一运行,返回值就确定了,再在其它部分对handles.output作更改也没有效果了。加上uiwait后,只有执行了uiresume后,才会继续执行到OutputFcn,在此之前用户有充分的时间设置返回值。在一个GUI中调用另一个GUI时,主GUI不需要特别的设置,同调用普通的函数一样。在打开子GUI界面的同时,主程序还可以响应其它的控件。不需要担心子GUI的返回值被传错了地方。 -
2007-04-22
MATLAB GUI中利用定时器制作动画 - [MATLAB]
(本文为Liuxqsmile原创,转载请给出原文链接)<<
/>>MATLAB中提供了一些动态显示图形的例子,例如vibes、truss等,但他们的程序结构都和由GUIDE产生的M文件的结构不同。truss中用while循环来更新图形窗口,pause函数来控制更新的速度。这样的结构是不适合放在某一个子函数中来执行的,否则程序在执行该子函数时无法响应用户的其它操作,只能一开始就设置终止条件,等待动画的自然结束。<<
/>>MATLAB中的定时器timer可以定时触发,周期性地执行指定的函数,我们可以据此来实现绘图的自动更新,而不会影响整个GUI对用户其它操作的响应。<<
/>>比如我们要让一个曲面随时间周期性地变形,类似vibes中的情形,按下“开始”按钮后,曲面开始周期振动,同时我们可以调整振幅大小、周期的长短。所不同的是我们一切都在子函数中完成。<<
/>>在GUIDE中建立界面元素后,在“开始”按钮的callback中建立一个定时器timer对象object<<
/>>handles.timer = timer(Period,0.05,ExecutionMode,FixedRate,<<
/>>... TimerFcn,{@PlotUpdate,handles});<<
/>>Period是触发的周期,这里设置为0.05s,ExecutionMode是执行的方式,可以有三种选择,对于不需要精确控制时序的动画的影响不大,TimerFcn指定触发时所执行函数的句柄,在这里我们建立一个函数PlotUpdate来执行绘图命令,handles作为参数传递到PlotUpdate中去。<<
/>>注意PlotUpdate的定义:<<
/>>function PlotUpdate(obj,events,handles)<<
/>>前两个参数是必不可少的,最后的handles才是用户传递的数据。在这个函数中你基本上可以无视前两个参数,按照曲面的运动趋势产生新的顶点坐标,然后用set命令将新的坐标赋给曲面(面片patch)对象的Vertices属性。drawnow更新就可以了。你可以用曲面对象的UserData属性存放当前振动的幅值相位等参数。<<
/>>然后在“停止”按钮的callback中st(handles.timer)停止定时器,就可以停止自动绘图了。<<
/>>在“增大振幅”按钮的callback中对振幅参数作修改。<<
/>>排除了一些小问题后,你的曲面终于可以动起来了,按“增大振幅”等也没有影响图形的运动,真的是“一点影响都没有”啊!<<
/>>问题出在哪里呢?原来,当定时器第一次触发时,用户指定的参数被传递到响应函数中执行,以后每一次触发,都是使用的这同一组参数,并不会随着程序的运行而更新。好了,现在可以在<<
/>>“增大振幅”中重新赋一次参数<<
/>>set(handles.timer,TimerFcn,{@PlotUpdate,handles});<<
/>>怎么样,达到你的要求了吧!想知道更多?MATLAB Help的index中输入timer,够多了吧。 -
2007-04-17
ANSYS数据导出:节点、单元、振型 - [MATLAB]
又参考了一下ANSYS帮助文件中的APDL编程部分,以及网上的一些意见,可以有更方便地得到节点坐标,单元内的节点列表的方法。在一个文本文件中写几条命令就可以了。而且可以指定输入写入的格式,不会出现两个数据首尾相接,在MATLAB中无法区分的问题。<<
/>>得到节点坐标和单元内包含的节点的程序如下,可以在ANSYS的帮助中找到每一个命令的详细解释。将下面的程序拷贝到一个文本文件中filename.txt,保存,去掉后缀名TXT,再拷贝到工作目录下。在命令提示符下输入*use filename,生产一个geomfile.txt文件,打开可以看到里面的数据<<
/>>! Get the coordinates of each node<<
/>>! Get the node list of each element<<
/>>! By:LiuXiaoqin(liuxqsmile@gmail.com), at nuaa,<<
/>>*get,nodenum,node,,num,max ! 获得节点的数目<<
/>>*dim,nodepos,array,nodenum,3 ! nodepos存放节点的坐标<<
/>>*do,i,1,nodenum,1<<
/>>*get,nodepos(i,1),node,i,loc,x !获得节点的X坐标<<
/>>*get,nodepos(i,2),node,i,loc,y<<
/>>*get,nodepos(i,3),node,i,loc,z<<
/>>*enddo<<
/>><<
/>>*get,elemnum,elem,,num,max !得到单元的总数目<<
/>>*dim,elemlist,array,elemnum,6 !单元包含的节点列表,指定每个单元包含6个节点,根据情况修改<<
/>>*do,i,1,elemnum,1<<
/>>*do,ii,1,6,1<<
/>>*get,elemlist(i,ii),elem,i,node,ii !获得节点编号<<
/>>*enddo<<
/>>*enddo<<
/>><<
/>>*cfen,geomfile,txt !打开文件,写入数据<<
/>>*vwrite,0<<
/>>(F8.0, Coordinates of each node)<<
/>>*vwrite,sequ,nodepos(1,1),nodepos(1,2),nodepos(1,3)<<
/>>(F8.0,3e16.8)<<
/>><<
/>>*vwrite,0<<
/>>(F8.0, Nodes No. of each element)<<
/>><<
/>>*vwrite,sequ,elemlist(1,1),elemlist(1,2),elemlist(1,3),elemlist(1,4),elemlist(1,5),elemlist(1,6)<<
/>>(F8.0,6f8.0)<<
/>><<
/>>*vwrite,0<<
/>>(F8.0)<<
/>>*cfclos<<
/>><<
/>>获得振型的方法也类似,首先获得模态的个数,然后读取每一阶模态的频率和每个节点的便宜量<<
/>>!从ANSYS中导出模态频率及振型数据<<
/>>!By:LiuXiaoqin(liuxqsmile@gmail.com), at nuaa,<<
/>>*get,nodenum,node,,num,max<<
/>><<
/>>*set,tempvar,0<<
/>>*set,modenum,0<<
/>>!获得模态的阶数<<
/>>*do,i,1,100,1<<
/>>*get,tempvar,mode,i,freq<<
/>>*if,tempvar,LT,0.0001,THEN<<
/>>*if,modenum,LT,0.0001,THEN <<
/>>*set,modenum,(i-1)<<
/>>*endif <<
/>>*endif<<
/>>*enddo<<
/>><<
/>>!*dim,modefqda,array,modenum,2<<
/>>*dim,modeshp,array,nodenum,3<<
/>><<
/>>*cfen,modefile,txt<<
/>><<
/>>*do,i,1,modenum,1<<
/>>*get,modefq,mode,i,freq<<
/>>*get,modeda,mode,i,damp<<
/>>*vwrite,modefq,modeda<<
/>>(2e16.8)<<
/>>set,1,i<<
/>>!获得每个节点的位移<<
/>>*do,ii,1,nodenum,1<<
/>>*get,modeshp(ii,1),node,ii,u,x<<
/>>*get,modeshp(ii,2),node,ii,u,y<<
/>>*get,modeshp(ii,3),node,ii,u,z<<
/>>*enddo<<
/>><<
/>>*vwrite,sequ,modeshp(1,1),modeshp(1,2),modeshp(1,3)<<
/>>(F8.0,3e16.8)<<
/>>*vwrite,0<<
/>>(F8.0) <<
/>>*enddo<<
/>><<
/>>*cfclos








