2007年4月25日星期三

MATLAB如何从GUI中返回参数

(本文为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年4月21日星期六

MATLAB GUI中利用定时器制作动画

(本文为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中stop(handles.timer)停止定时器,就可以停止自动绘图了。
在“增大振幅”按钮的callback中对振幅参数作修改。
排除了一些小问题后,你的曲面终于可以动起来了,按“增大振幅”等也没有影响图形的运动,真的是“一点影响都没有”啊!
问题出在哪里呢?原来,当定时器第一次触发时,用户指定的参数被传递到响应函数中执行,以后每一次触发,都是使用的这同一组参数,并不会随着程序的运行而更新。好了,现在可以在
“增大振幅”中重新赋一次参数
set(handles.timer,'TimerFcn',{@PlotUpdate,handles});
怎么样,达到你的要求了吧!想知道更多?MATLAB Help的index中输入timer,够多了吧。

2007年4月20日星期五

Planetary Ingredients All Mixed Up


原文地址:http://sciencenow.sciencemag.org/cgi/content/full/2007/417/1?rss=1
By Govert Schilling
ScienceNOW Daily News
17 April 2007
翻译:liuxqsmile
(水平所限,漏误难免,请参考原文)
(英国普雷斯顿)行星是从一些稀薄的物质逐渐生长起来的,这些物质包括宇宙诞生初期残留的气体和恒星死亡时释放的星尘。目前,天文学家观察到了行星通过涡流和冲击波将这些成分组合起来。皇家天文学会的国家天文学会议上展示了一项最新的发现,通过一个新的计算模型,可以深入了解行星以及最终形成生命的复杂分子的形成机制。
星尘的构成材料来自于(像太阳一样的)恒星在他们生命的最后阶段形成的体积巨大的稀薄的红色膨胀物。膨胀物的边缘逐渐消融到空间中去,也将其中的元素(比如对生命诞生至关重要的碳元素)分布到空间中。随后,恒星的灰烬呈现为可见的星云,一团富含氧、碳、氮的气体。虽然天文学家知道这些材料最终在空间中混合、传播,但并不非常清楚它的具体过程。去年,英国Jodrell Bank 天文台的天文学家Chris Wareing 和他的合作者,通超级计算机模拟发现了星云中与运行速度有关的涡流和一种称为弓状冲击波(bow shock)的紊流。现在,他们称已经在Sharpless 2-188行星星云中观察到了这些效应。
Sharpless 2-188 位于仙后星座,距地球850光年,与许多行星星云不同,它是不对称的而不是球形的,Wareing的研究结果称,星云中的最亮的部分(与弓状冲击波一致)是由于该星以125Km/s的速度运动而产生的。位于La Palma, Canary Islands上的另一个研究小组使用2.5m的光学显微镜也获得了星云极为稀薄的“尾焰”中的涡流,与计算机模拟的结果一致。
英国曼彻斯特大学的天体物理学家Ciska Markwick-Kemper 认为,我们需要这些细节来了解复杂分子和星尘中粒子的存活概率,这有助于我们弄清楚星际材料怎样转化为行星,以及紊流在形成物质密度集中区域中的作用,在这些区域,复杂分子才能得以保存。

2007年4月17日星期二

Careful Where You Plant That Tree 橘生淮南

原文地址:http://sciencenow.sciencemag.org/cgi/content/full/2007/410/2?rss=1
By John Simspon
ScienceNOW Daily News
10 April 2007
翻译:liuxqsmile

(水平所限,漏误难免,请参考原文)
并不是所有的树木对气候的影响都是相同的。树木在热带可以使气温降低,而在高纬度地区则加剧全球变暖。这下环境斗士们可以更好地调整他们的火力了。

树木对局部气候有两种相互矛盾的作用方式。 一方面,吸收大量的二氧化碳,而二氧化碳由于能够吸收热量而使气温升高;同时,通过蒸发作用,将水蒸发到空气中形成云层,阻挡阳光的照射。 但是另一方面,树木也能够吸收阳光的热量, 阻挡积雪对紫外线的反射,使局部气候变暖。加利福尼亚州的Lawrence Livermore国家实验室的大气学家Govindasamy Bala领导的一个研究小组提出这样一个问题, 这两种方式中的究竟哪一种起主导作用是否取决于树木生长的位置?

研究小组通过计算机模拟森林全部被砍伐的情况,与没有砍伐时的标准模型进行对比,发现采伐产生的影响取决于位置,在北半球的高纬度地区,树木吸收热量、阻挡积雪反射的作用,超过了吸收二氧化碳减轻温室效应的功效。在没有森林的情况下,到2100年,这些地区的气温将降低0.8摄氏度,而在热带地区的情况则相反,气温将升高0.7摄氏度。在温带,这两种效应的影响几乎相互抵消,气温的变化只有0.04摄氏度。

气候学家Victor Brovkin认为,这项研究说明在热带地区造林可以减缓全球变暖,而在高纬度地区造林就要多考虑了。但他同时也警告说,我们不能据此低估森林的重要性,森林作为野生动物的栖息地在保护生物多样性上仍有重要的意义。

2007年4月10日星期二

ANSYS数据导出:节点、单元、振型

又参考了一下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

*cfopen,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

*cfopen,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

2007年4月5日星期四

Rich Brain, Poor Brain 富脑,穷脑


原文地址:http://sciencenow.sciencemag.org/cgi/content/full/2007/404/3?rss=1
By Mary Beckman
ScienceNOW Daily News
4 April 2007
翻译:liuxqsmile

(水平所限,漏误难免,请参考原文)
除了吝啬鬼和约翰·洛克菲勒以外,大多数富人可能都不会在意路边的几毛钱。而最新的实验证实,小额钞票在富人眼里确实不像在穷人眼里那样值钱。
剑桥大学的心理学家Philippe Tobler等对14位志愿者进行了一项测试。研究人员给志愿者展示两张相似图片中的一幅,答案正确的将会看到一个硬币(20便士,40美分)的图片,并且得到报酬。研究者指导受试者通过按键的时间长短,表明他们对即将看到硬币图片的确定程度。研究者认为志愿者越快地学会测试,表明其对这20便士的期望越高。(PS:这里没看懂)
志愿者的收入从零到将近3万英镑(6万美元),平均近1,0250镑。研究者发现,低收入者学会的速度平均是高收入者的3倍。他们的成果发表在本周的《Neuron》上。研究者还在测试时,对志愿者的大脑进行MRI(磁共振成像)扫描。有三个区域在测试中“点亮”(变活跃),而高收入者的大脑要经过更长的时间才“点亮”。Tobler认为,这个结果表明20便士在富人眼里没有在穷人眼里值钱。
位于新泽西的普林斯顿大学的心理学家Daniel Kahneman评论说,结果很有意思,一个人的富有程度会改变他大脑对零钱的反应,但他更想知道,回报更大时,有钱人的反应是不是更快。

2007年4月3日星期二

不是你的血型?没关系!Not Your Type? Don't Sweat It

原文地址:http://sciencenow.sciencemag.org/cgi/content/full/2007/402/3?rss=1
Not Your Type? Don't Sweat It
By Dan Ferber
ScienceNOW Daily News
2 April 2007
翻译: liuxqsmile

(译者水平有限,漏误难免,仅供参考。)
一种新的技术可以将A型和B型血红细胞转化为万能血型:O型,该技术有助于缓解血液短缺问题。
人类有四种基本血型:A、B、AB和O型,不同血型分子角度上的区别在于血红细胞表面的抗原,可以引发自身免疫系统的强烈反应。拥有A型抗原的个体对B型血产生抗体,引起身体对输入的B型血产生排斥。B型血的个体输入A型血也会产生同样严重的后果。而O型血由于同时缺乏这两种抗原,可以安全地输入所有四种血型的患者体内,而O型血患者只能接受O型血。这就意味着,O型血更容易短缺,这时患者需要不同血型的捐献者提供的血液。
为了解决O型血的短缺问题,丹麦哥本哈根大学的glycobiologist,Henrik Clausen和一家生物工程公司(ZymeQuest,位于马萨诸塞州,伯克利)的研究小组,致力于寻找一种可以将其他血型转化为O型的酶。A型和B型抗原含有形似的碳氢支链,区别仅在于支链顶端的糖基。研究者要找的酶要能够在不损伤血红细胞的情况下将抗原的糖基取下。ZymeQuest公司之前曾经分离了一种咖啡豆酶(coffee-bean enzyme)在B型抗原上可以达到这个目的,但是效率很低。为了寻找能够大量产生的效率更高的酶,他们测试了2500多种细菌和真菌,最终他们发现了两种酶:一种来源于婴幼儿脑膜炎的致病细菌,可以将A型血转为O型;另一种,来源于人类内脏中的细菌,可以将B型转为O型(两种酶共同作用可以将AB型转为O型)。
据研究者在Nature Biotechnology上的报道,经过这两种酶处理的血红细胞,在美国FDA认证的血型检测和化学检测中都没有发现抗原的存在。Clausen说,ZymeQuest目前正在临床测试A型转化酶的有效性,并且希望能在今年晚些时候开始B型转化酶的临床测试。

2007年4月1日星期日

Ansys中划分好的网格导入MATLAB


本文的目的是将ANSYS中划分好的单元网格导入到MATLAB中,并显示。

方法很简单(对三维实体单元不适用):

在ANSYS中建立模型,进行网格划分,用命令"cdwrite,geom,filename,ans"将网格划分结果导出,filename是用户指定的文件名。

该命令产生的filename.ans实际上是一个ASCII文本文件,用记事本打开,可以看到其中的数据记录格式,前四行是字符,跳过,紧接着是一个列表,参照ANSYS中的模型数据,很容易看出这是模型中所有节点的坐标表。从第四列开始分别是节点的X、Y、Z坐标(注意其中有省略的项)。

如果X坐标为负,则可能和前面一列的0接在一起,在MATLAB中被认为是一个数,要做适当的处理。

再跳过节点坐标表下的三行字符,下面是一个单元和节点的关系表。表11列是单元的序号,12列之后是该单元包含的节点列表。如果是杆单元则有两个节点,四边形单元则有四个节点。

在MATLAB中读入上述两个列表(fopen打开文件,fgetl按行读入字符串,str2num将读入的字符串转为数据,fclose关闭文件),用patch命令显示面片:

patch('Vertices',节点坐标表,'Faces',构成单元的节点列表,'FaceColor',[.39,.47,.64])

我只用杆单元和简单的四边形单元试了一下,没有问题。对于实体单元,每个单元中仅有各个顶点的列表,不能直接生成实体的各个面。