Bug 的个人资料封印的九尾照片日志列表更多 ![]() | 帮助 |
|
2009/9/16 matlab如何将gui生成exe如何将gui生成exe 方法一: 已有gui.m文件和gui.fig文件 1 在matlab的command窗口中输入 mcc -B sgl GUI.m 2.将上步生成的文件包括*m 文件和*.fig文件一起考到待运行的机器 此时仍需matlab所必需的动态连接库。 3. 将 <matlab path >/extern/lib/win32/mglinstallar.exel拷贝到到待运行机器上 4.在机器上先运行mglinstallar.exe, 然后选择解压目录,将在将在指定目录下解压缩出bin和toolbox两个子目录, 其中在bin\win32目录下就是数学库和图形库脱离MATLAB运行所需的所有动态连接库,共 有37个。可以将这些.dll考入system32, 也可以直接放在应用程序目录下。 而toolbox目录则必须与应用程序同一目录。 方法二:
matlab编程很方便,强大的矩阵运算功能,很多好用的工具箱,但是一般程序都要在matlab环境中运行,能否脱离这个环境打包发布呢,matlab也提供了这样的工具。 1. 转化为c/c++程序并编译为.exe 2. 在未装matlab的电脑上运行程序需要数学 运行时库、图像运行时库以及用到的工具箱mex文件 3. 在确保.exe程序可以运行的情况下 可以用setup factory打包发布 一、 完全可以,而且生成的.exe文件可以在没有安装matlab的机器上使用,方法吗--- 首先,使用mcc编译得到.exe文件,具体参数见帮助文件; 其次,将.exe文件及相关资源文件以及一个称为mglinstaller.exe的软件包一起拷到别的机器上,运行mglinstaller.exe,并添加环境变量path,即可执行.exe文件 第三,在MATLAB环境,执行命令 mcc -m -B sgl file.m 或者 mcc -p -B sglcpp file.m 请键入help mcc看帮助。 mcc是在“command windows” 用的吗? 只要“mglinstaller.exe”,与.exe文件及相关资源文件就可以了吗. 还有“添加环境变量path”是path到.exe文件的环境中是吧? 二、 在matlab下的workspace里打comtool,点file-open project将我们先前建好的comtest.cbl工程文件打开,再点component--package component就实现了打包,此时到comtest\distrib文件夹里看,生成的comtest.exe就是打包后的解压程序,双击它会解压出一些文件,再点击解压出来的_install.bat就可以实现安装 三、 如何将gui生成exe ? 已有gui.m文件和gui.fig文件 1 在matlab的command窗口中输入 mcc -B sgl GUI.m 2.将上步生成的文件包括*m 文件和*.fig文件一起考到待运行的机器 此时仍需matlab所必需的动态连接库。 3. 将 <matlab path >/extern/lib/win32/mglinstallar.exel拷贝到到待运行机器上 4.在机器上先运行mglinstallar.exe, 然后选择解压目录,将在指定目录下解压缩出bin和toolbox两子目录,其中在bin\win32目录下就是数学库和图形库脱离MATLAB运行所需的所有动态连接库,共有37个。可以将这些.dll考入system32, 也可以直接放在应用程序目录下。而toolbox目录则必须与应用程序同一目录。 5.大功告成。 MATLAB Toolbox Path Cache is out of date and is not being usedWarning: MATLAB Toolbox Path Cache is out of date and is not being used. Type 'help toolbox_path_cache' for more info 照提示键入 看到这里: 发现General有一个Update Toolbox Path Cache 按钮 2009/9/8 纪念NTU-吃住玩篇NTU的地理位置相对于NUS来说确实算荒郊野外,也就是新加坡的乡下。以前NUS的朋友来我们这,想逛街,看了看JP,说你们这咋啥都没有啊。。。我45度望天,想着,可我咋挺知足的啊 【住篇】 乡下也有乡下的好处,租房便宜!我来的时候NUS附近的common room大概就要500-600,而我租到的第一个小common是81X那边,300包水电网。大家都说我运气好,但大家都忘记了运气是实力的一种 当时大家都租的是350包水电的平均水平,为啥我能租到300水电网,大家一定想知道我有什么秘诀。不想知道?那我也要说。其实是二房东也是刚住过来,不太清楚乡下房价。后来二房东以整套出租为由,让我换地方。可是我在快走时却惊奇的迎来了租我这个单间的一NTU fellow。一问,好家伙,升到450了。。。那小破屋450?不过对于在学校招待所一天80(据他说)来衡量,他给450肯定感觉很幸福 第二个住处是张宇友情提供的,就是和张宇合租一间,在靠近盛松超市的student hostel,就算加上水电也是350以下。那里曾经是警察宿舍,有一大圈铁栅栏,某人说看起来像监狱 现在住的是pioneer附近550包水电网带空调的大common,这个大家不感兴趣,我就不细说了 【吃篇】 A。其实A里的日本饭挺不错呀,起码比JP里B1的马来人做的日本饭正宗不少。虽然觉得第二家碱面不咋地,但貌似永远排队最长。没胃口的时候吃吃手工面也不错,挺鲜的,刺激食欲。但量很少,我吃不饱。。中餐哪里都差不多,有时候有些肉做的还不错。素食,这个我原来是有阴影的,做的那么像肉,而且还提供鸡蛋,我虽然疑惑但也坚信我吃到了肉。我第一次吃完几天后都不能承受我的味觉被欺骗的打击 B。B有个Mr.Bean,卖小饼,豆腐脑和豆浆。对于在国内常喝豆腐脑的人来说,回忆的力量很强大。于是这家很好卖,有时候到下午居然告知豆腐脑卖完了。不过虽然菜单都是英文的,但这家的女服务员,听不懂英文。B里本来老北京的饺子还可以,但现在厨师换了吧,不好吃了。 2。刚来的时候学长跟我说,2那里有supermaket。可我绕着那块看了半天,始终不敢相信那个小卖部被称作了supermaket。现在暂且这么理解吧,在新加坡,啥都要mini一圈。牛肉大王那家是异常火爆,红焖牛肉饭在饿的时候吃是忒满足啊~葱爆牛肉偶尔吃吃很好,味道很浓,吃多了腻味。川菜那家因为觉得所有菜都一个味道,所以没啥兴趣,偶尔来个水煮牛肉还不错。酿豆腐,没胃口的时候喜欢吃,因为它没味道。。。虽说新加坡这里鸡饭据说很有名,但为啥这家鸡饭的老板换的那么勤呢?生意惨淡啊~~~不要问中餐那几个小伙子那绿色的是什么菜,他们不认识,只会跟你说是“蔬菜”,还会嘲笑你连蔬菜都不认识。他们给的量都很少,还会把菜夹到你盘子里,想一想,再夹出去。我极其喜欢吃椰子,can 2有椰子而且帮着砍开,对我来说是极大的满足。不得不提的还有2的夏日霜,之前无法想象沙冰居然能做到如此美味!各种奇特材料专制的磨冰,加上各种玲珑小配料,不得不说是美味。 1。1去的没2多,早期的1除了中餐没啥特色,后来NTU校友开了外婆家,于是麻辣烫火了起来。鸭饭那家的盖浇饭也非常不错。西安小吃那家的面还行,但外加的配菜总给我感觉吝啬。其实西安小吃的砂锅,就是加强版的麻辣烫,非常爽 3。3的小炒一般,中餐一般,鸡饭一般,没啥好说的。 13。13的韩国料理被评为NTU学生最喜欢的料理,味道确实不错,推荐一试。不过这的拌饭不给加热,小气。其他的不加评论。 11。11在GH边上,刚来时候吃的不少。那时候的西餐给三块鸡排,只要3.5,非常不错。现在每况愈下。中餐两荤两素3.5。面那家给的菜特别咸。 9。9离11一小段距离。这里的面要重点推荐。面这家就是原先老A的面。西安风味起家(老板娘就是西安人),种类繁多,纯手工制作,味道很好。这家的中餐也是全校最便宜的,两荤两素只要2.5。但不知道现在还做不做中餐。 5。5只去过一次,逛校园时候走到的,要了一份排骨王,一塌糊涂,再也不去。 sbs。sbs其实是个咖啡厅,因为靠近SBS学院所以被这么简称。sbs经营的方面除了正餐,还有糕点,饮料和小卖部(这个我无论如何也得称之为小卖部)。他们的中餐非常好吃,虽然贵一点,但给的量很大,在其他地方要吃两荤两素的我,这里一般只要两荤一素。原先的海鲜砂锅会给多到惊叹的虾,后来越给越少。虾仁炒饭本来给的虾也很多,后来只给四个。中餐里给一堆,所以不再吃虾仁炒饭了。chicken/beef baked rice只有中午才有,要4.5,主要是饭上有cheese+pizza的料,我极其喜欢但吃不饱。。。乌冬面本身没啥香味,关键是配的鸡肉或者虾肉,是裹了炸肉料炸出来后,再沾上日式酱油,香脆可口。sbs会给一张绿色的计次卡,10次消费就能兑换两厅饮料。不知道多少人是怀着这种兑奖心态而来的。 ISC。ISC和sbs是一家,所以味道一样,提供中餐和西餐,西餐的速度很慢。这里是离N4最近的饮食地点,所以事物缠身的老板们经常在这里吃饭。找不到老板可以来这里逛逛。 校外的话,最近的巴沙是9区的巴沙,在179出校门后第一站和第二站中间。科大的同学们经常去那吃螃蟹。螃蟹确实好吃,不过毕竟是凉性,多吃胃寒。重点推荐海鲜那家的水晶河粉。这道菜竟然都没列在菜单上,是大家口口相传的。想当初是吴建华师兄带我去吃的。我问为啥不列在菜单里,那里的服务员很拽的说:因为大家都知道啊 盛松旁边的巴沙,需要推荐的首当其冲是韩国料理。这家韩国料理味道一级棒,感觉比校内那家好。拌饭5块一份,包括蘑菇,胡萝卜丝,青菜,鸡蛋等,可选鸡/猪/牛肉,加上韩国特色辣酱,自己搅拌。营养好吃又实惠,包你吃到撑。石锅拌饭,就是加5毛钱,换个黑锅,把饭烧糊点给你,不值得。和韩国料理同一侧,有一家炒菜,只吃过两次,不过牛肉做的很有味道。另一侧的laksa也很好吃,这个味道不是每个人都喜欢。我喜欢也许因为laksa的配料里有椰浆~ JP。翡翠拉面小笼包我很喜欢,自己一个人都去吃过几次。各种中国式的小点会让你回味起很多东西。来来红烧牛肉面(一直觉得这边餐饮人员招揽顾客时候说“来来”很有趣,没想到就有叫这名字的店),面不错,牛肉泡在汤里已经感觉不出红烧了。套餐的配菜,三层肉和肉松炸茄子很好吃,豆腐类的一般化。NewYork的招牌牛排,好大好大的一块啊,特别实惠,不过所有其他的套餐给的都很少。老JP三楼foodcourt不少东西都不错,不一一列举了(现在貌似由于装修而关闭),老JP B1的foodcourt是噩梦。新JP二楼foodcourt外有哈根达斯,味道不用评价。fairprice外有一家酸奶店,各式各样的酸奶让人大饱眼福,味道很享受,不过不要听她们的优惠忽悠,多买你吃不完。JP B1新老连接处的日本街,有不少原味的日本料理,拉面都不错,看起来就有食欲。这里还有新加坡最贵的自助餐,不过只要你有肚子 就火锅而言,这边大多是川味火锅,因为经营方便。只需要买食材,买底料,买调料,买固体酒精。没有任何烹饪技术也不用担心顾客说味道不正。顾客在乎的只有给的肉够不够。所以,川味火锅就不评论了。老百美楼上就有一家,每人只要16.6,不包饮料,但楼下就是超市嘛。而不少人还是执着的坐MRT去kallang吃17-20块一人的火锅,也许那边风景更好,秀色可餐吧。 Chinatown的国府珍锅,是新加坡川味火锅外最好吃的中式火锅,他的海鲜酱非常有名,厨师偶尔配送的小点心都非常好吃。另外有家川菜自助极其赞,量大实惠,每次都感觉能吃到他们亏本,但服务员仍然笑脸相迎,实属不易。名字记不得了,这里的川味饭店取名都很没创意,川 蜀 重庆 这几个字哪家都用,让人绕不清。这家我之前住student hostel时候提过很多遍,没人感兴趣,那我就不管啦。 最近在pioneer的foodcourt吃了药材鸡汤和皮蛋瘦肉粥。我一贯讨厌喝鸡汤,因为鸡汤容易把鸡肉熬的像粉末一样索然无味难以下咽。但这家的药材鸡真是赞,汤虽然微苦却有浓郁的芬芳,香味扑鼻。粥其实做起来不难,但校内总把煮干饭当粥卖,让我一度对新加坡的饮食表示失望。看到粥居然能当特色来开店,苦笑之余,也有点欣慰。这家的粥味道正宗,暖胃,舒心。 【玩篇】 圣淘沙,海滩的细沙据说是进口的,也不知道是哪里来的,反正是“国外”的高质量沙子。唱着“浪花一朵朵”在海浪间追逐嬉戏,想起来都是挺雷人的画面。不过挺好玩的~买了套票后有不少景点可以玩,最好玩的要数卡丁车了。一个操纵杆来控制方向和刹车,从山上沿着蜿蜒的坡道冲下来,非常刺激,我冲下来能超越5人耶~(疯子|||)。巨型鱼尾狮是照相的必到之处。鱼尾狮屁股里的法国餐厅好贵啊。圣淘沙这里有个小岛,说是北半球最南端,值得一去,那岛上还有一些很丑陋的santosa的石头字,给人照相。圣淘沙的激光喷泉是亚洲最大规模的激光喷泉。晚上7点和9点各有一场表演(原来不要钱的,现在要啦),就是在喷泉水雾上用激光演绎一段3D的故事。搭配着会有一些火柱喷射效果,虽然隔着20多米远还是觉得好热 动物园safari。听着这儿的人像读拼音一样读这个单词还把最后一个音拖长,会觉得浑身别扭。去的时候是晚上,有东西两个区,一边的镇区之宝是狮子,另一边是大象。主要有两项任务,一是跟着游览小列车去看各类动物,二就是动物表演。在小列车上能碰触到行走在旁边的食蚁兽和猪獾等动物,他们都很拽,瞅都不瞅你一眼。狮子震慑性的吼叫还是会让你胆战心惊,而且,你和他之间看似没有任何防护性阻隔(其实应该有,比如电网啥的)。不安排好时间的话,动物表演就看不到了。木讷的管理人员只要演出开始了就不让人进,但其实位置还是很多的,溜进去照样看。表演途中会有一些假事故发生,不要惊恐。但这些假事故足以把有心脏病的人吓到发病。 Chinatown有很多日本动漫和欧美动漫周边,这让我很奇怪也很感兴趣。不过细看的话你会感觉,大家进货渠道是不是都一样啊,挨着的店几乎说不出区别。所以想淘到好东西还是要气定神闲的慢慢找。 vivocity的夜晚很漂亮,一到周末的晚上,每隔不到10米就坐着一对情侣。在这里,你可以把所有烦心事都放下,静静的看海里月亮的倒影,和友人敞开心扉慢慢聊。 东海岸适合运动,国人用来代步的自行车,在这里是专门用于运动健身的工具。看着有的当地人骑车时不屑的眼神,我就想:偶灵活地穿梭在拥挤的车流中时,你丫还不会骑车呢。当然东海岸还可以溜冰,玩晃晃板,和弹弹乐。沙滩和海水也不错,但没圣淘沙的好。我永远记得这么个情景:大家骑着自行车悠闲的滑行,笑着对我说:你怎么溜冰溜这么慢啊,某人还提议:来,我们飙车吧!然后众人欢笑着远去,丢下我一人在凹凸不平的路上行走。。。 总统府就是一个高尔夫球场。能看到新加坡总统护卫队一类的军人(还是祖国的国旗护卫队帅)。除了感受资本主义的奢华外,只有我也到此一游的回忆。 我喜欢唱歌,去过k-box,partyworld和topone。k-box的房间很小,可能因为音箱位置问题,两个话筒一起唱容易有啸叫声,很扫兴。按人头算钱。partyworld房间大些,和国内类似按包间算钱,不太有啸叫声,但歌曲没k-box多。topone是新加坡最便宜的ktv了,学生价20,上午11点到晚上6点!唱到你满足为止!而且里面的套餐只要3块钱,一大份,让人难以置信。这家一般不提前2天订位是绝对没位置的。 以上纯属个人感受,如有不妥,欢迎切磋。知道其他好吃好玩的地方请赶紧告诉我,来者不拒。 纪念NTU-CEMNET篇CEMNET是一个很不错的地方,加入这里,让我有幸能拜会了各路强人。现在要离开了,一定要回味一下。
【研究氛围】 这里牛人众多,不少人发paper速度极快,水平极高,赞誉极多,让人极其羡慕。同领域的讨论很热烈,很深入。这样才是做研究的地方嘛。当然,牛人也是要靠勤奋的,是要像在校内每天种菜偷菜那样勤奋才行的!在这我得重点感谢翟光涛和段琦。翟光涛在我们lab呆得不久,天天在那调程序写paper,可能认识他的人不多。老段没人不知道吧,哈哈,他们俩对我帮助都很大,诚心感谢!其他兄弟姐妹们对我在学习生活上的关怀和爱护,小弟也会铭记于心! 【娱乐】 我们lab外出游玩机会不少,而且每次都有专职摄影师跟团,以优秀的拍摄手法和巧妙的拍摄角度,留下无数成员以外的倩影,回来后供大家欣赏和品味。前段时间太忙没能和大家一起开心,非常遗憾,下次有机会一定不要忘了我! 【我的位置】 我不想呆在lab太久,有一个原因就是这打印机。不仅是因为它的噪声,还因为很多人在我身边打印时候都盯着我的屏幕看。我理解,等东西打印好这个时候是很无聊,但是盯着人家做东西盯半天这也很不礼貌吧?不仅看还问,有的不好解释或者不想说的事,就不要纠缠了啊,一个人解释过了,下一个人打印时又来问一遍,下一个人打印时又来问一遍,这样我的时间也就在打印机的噪声和重复解释中过去了 我离电话最近,使得我们这块其他人都不愿意接电话。好吧,既然做这里,那就接受这个义务。为了能更好的认人,我还专门照了一张我们lab的人名图,打印后将名字描粗,贴在电话桌上,四边都贴了透明胶固定好。可就是有人打电话时候有毛病,一边打电话一边抠透明胶,然后把纸撕坏。我这是为大家方便才做的,他这是干啥。。。既然这是实验室,那么就要尽量安静吧,有些人打电话嗓门大,时间长,还在电话里吵架 牢骚发完了~按lab的座位说说我接触到的大家吧 高盛华 王正翔 王欢 胡轶群 段立新 程显刚 钟峰 李刚 滕霄 黄祎 张宇 李佳明 张蓬 郭甜甜 张举勇 李一凡 段琦 杨文娴 杨盛波 张达 王丹奇 梁山 陆海峰 方硕
可能还有一些朋友没有提及,如有漏掉请赶紧提醒我哈,还有的人因为接触不多不甚了解呀。不过我认人认脸,见面一定认识。一生能相遇已经是缘分了,能认识成为朋友更是缘分。我是不会忘记大家的,这都是一生的朋友 我这刚走,大家座位就大调整。这个不重要,重要的是紧接着有个庆祝CEMNET调整完毕的聚餐,于是我就没口福了。大家每人给我多吃一口,当帮我吃的好了 2009/8/25 matlab GUI调用MediaPlayer播放AVI的尝试先看了《精通MATLAB GUI设计》 5.4.2的AVI文件执行
按其所说,无效
function open_menu_Callback(hObject, eventdata, handles)
[FileName,PathName,FilterIndex] = uigetfile({'*.avi','M-file (*.avi)'},'Choose a video'); if ~FileName return end %Get the handle to the MediaPlayer. This is a child object of the MovieControl.
mp = handles.MovieControl.MediaPlayer; %Call the "Open" method on the MediaPlayer to load a file.
Open(mp,[Pathname Filename]); function play_video_Callback(hObject, eventdata, handles) pos = [0 0 0 0]; %Store handle in handles structure 这是两个主要菜单函数
不过发现有 Reference to non-existent field 'MovieControl' 错误,而且一搜索大家都是这个错。
这个视频教程是07年11月制作,而我现在用的是matlab2007a,是2007年1月29日的版本,难道是matlab版本问题?
发现一个朋友如此回答:
论坛教学视频使用的MATAB版本较早,应该是7.0左右。而现在新的版本(R2006a以后)对控件应用进行了修改:
Compatibility Considerations Before the validation check was added, some server ProgIDs worked with actxcontrol , probably because there are cases where Microsoft software points the server GUID to a control GUID underneath. An example of a ProgID that might not work with actxcontrol is the Windows Media® Player server ProgID Mediaplayer.mediaplayer.1. Therefore, depending on how Microsoft software registers the control, the following command might now return an error: h = actxcontrol('Mediaplayer.mediaplayer.1'); % Returns an error The correct ProgID to use for Mediaplayer is the ActiveX® control ProgID: h = actxcontrol('WMPlayer.OCX.7'); % Use control ProgID Note that methods and properties to open and play files are different when using the control ProgID. You can disable the validation check with the following command: feature('COM_ActxProgidCheck',0) Or reenable it with: feature('COM_ActxProgidCheck',1) By default, ProgID checking is on. 6楼应该是用了较新版本的MATLAB才产生上述错误。 不管他说的早晚是不是颠倒了,试过之后仍然无效,是微软的问题么?换来换去干嘛呢。。。
本来想做个好点的GUI,现在视频就算了呃,看着不够炫就找微软吧~
如果有朋友知道如何解决请告知,不胜感谢 2009/4/9 光流(optical flow) 光流法(optical flow method) 光流场(optical flow field)光流是空间运动物体在观测成像面上的像素运动的瞬时速度。光流的研究是利用图像序列中的像素强度数据的时域变化和相关性来确定各自像素位置的“运动”,即研究图像灰度在时间上的变化与景象中物体结构及其运动的关系。将二维图像平面特定坐标点上的灰度瞬时变化率定义为光流矢量。
光流场(optical flow field)是指图像灰度模式的表观运动。它是一个二维矢量场,它包含的信息即是各像点的瞬时运动速度矢量信息。研究光流场的目的就是为了从序列图像中近似计算不能直接得到的运动场。 当人的眼睛观察运动物体时,物体的景象在人眼的视网膜上形成一系列连续变化的图像,这一系列连续变化的信息不断“流过”视网膜(即图像平面),好像一种光的“流”,故称之为光流(optical flow)。光流表达了图像的变化,由于它包含了目标运动的信息,因此可被观察者用来确定目标的运动情况。
1981年,Horn和Schunck创造性地将二维速度场与灰度相联系,引入光流约束方程,得到光流计算的基本算法。人们基于不同的理论基础提出各种光流计算方法,算法性能各有不同。Barron等人对多种光流计算技术进行了总结,按照理论基础与数学方法的区别把它们分成四种:基于梯度的方法、基于匹配的方法、基于能量的方法、基于相位的方法。近年来神经动力学方法也颇受学者重视。
1 基于梯度的方法 基于梯度的方法又称为微分法,它是利用时变图像灰度(或其滤波形式)的时空微分(即时空梯度函数)来计算像素的速度矢量。由于计算简单和较好的结果,该方法得到了广泛应用和研究。典型的代表是Horn-Schunck的光流计算方法,该方法在光流基本约束方程的基础上附加了全局平滑假设,从而计算出光流场。基于此思想,大量的改进算法不断提出。Nagel采用有条件的平滑约束,即通过加权矩阵的控制对梯度进行不同平滑处理;Black和Anandan针对多运动的估计问题,提出了分段平滑的方法。虽然很多基于梯度的光流估计方法取得了较好的光流估计,但由于在计算光流时涉及到可调参数的人工选取、可靠性评价因子的选择困难,以及预处理对光流计算结果的影响,在应用光流对目标进行实时检测与自动跟踪时仍存在很多问题。 2 基于匹配的方法 基于匹配的光流计算方法包括基于特征和区域的两种。基于特征的方法不断地对目标主要特征进行定位和跟踪,对目标大的运动和亮度变化具有鲁棒性(robustness)。存在的问题是光流通常很稀疏,而且特征提取和精确匹配也十分困难。基于区域的方法先对类似的区域进行定位,然后通过相似区域的位移计算光流。这种方法在视频编码中得到了广泛的应用。然而,它计算的光流仍不稠密。另外,这两种方法估计亚像素精度的光流也有困难,计算量很大。在考虑光流精度和稠密性时,基于匹配的方法适用。 3 基于能量的方法 基于能量的方法首先要对输入图像序列进行时空滤波处理,这是一种时间和空间整合。对于均匀的流场,要获得正确的速度估计,这种时空整合是非常必要的。然而,这样做会降低光流估计的空间和时间分辨率。尤其是当时空整合区域包含几个运动成分(如运动边缘)时,估计精度将会恶化。此外,基于能量的光流技术还存在高计算负荷的问题。此方法涉及大量的滤波器,目前这些滤波器是主要的计算消费。然而,可以预期,随着相应硬件的发展,在不久的将来,滤波将不再是一个严重的限制因素,所有这些技术都可以在帧速下加以实现。 4 基于相位的方法 Fleet和Jepson首次从概念上提出了相位信息用于光流计算的问题。因为速度是根据带通滤波器输出的相位特性确定的,所以称为相位方法。他们根据与带通速度调谐滤波器输出中的等相位轮廓相垂直的瞬时运动来定义分速度。带通滤波器按照尺度、速度和定向来分离输入信号。 基于相位的光流技术的综合性能是比较好的:速度估计比较精确且具有较高的空间分辨率,对图像序列的适用范围也比较宽。同时,这里仍有几个问题值得讨论: (1)与基于能量的光流技术一样,基于相位的模型既有一定的生物合理性,又有较高的计算复杂性; (2)尽管相位技术用两帧图像就可计算光流,但要获得足够的估计精度,就必须有一定的整合时间,这个延迟将会降低边缘处运动估计的时间分辨率; (3)Fleet和Jespon的方法对输入图像序列中的时间混叠比较敏感。 5 神经动力学方法 计算机视觉研究的初衷就是为了模仿人类视觉系统的功能。然而人类理解与识别图像的能力与计算机形成了巨大的反差。视觉科学家们迫切期望借鉴人类处理图像的方法,以摆脱困境。对于光流计算来讲,如果说前面的基于能量或相位的模型有一定的生物合理性的话,那么近几年出现的利用神经网络建立的视觉运动感知的神经动力学模型则是对生物视觉系统功能与结构的更为直接的模拟。 Grossberg等人的视觉运动感知神经动力学模型描述了运动感知中视皮层简单细胞、复杂细胞、超复杂细胞以及视网膜双极细胞之间的相互作用,揭示了运动分割与组合、竞争与合作的神经整合机制。这个称为运动边界轮廓系统的神经网络解释了复杂运动图形上的局部模糊运动如何被积极地组织成一个整体一致的运动信号,给出了整体小孔问题的一个解。这个模型对于整体运动方向的判别非常有效,然而它却不能给出运动速度的大小。 Fay和Waxman模仿视网膜中的时空处理和大脑的视觉运动通路,基于并联动力学提出了一个多层神经网络,它涉及光适应、边缘增强和边缘速度提取等几个处理阶段。网络中,每个节点的动力学特性类似于具有可变电导的细胞膜,光适应利用神经元间的抑制作用来获取,空间对比度增强借助于一个修正的on-中心/off-周边反馈网络来实现,最后的速度估计由一个称为对传活化法的动力学方程来提取。这个神经网络在一并行机上实现了30帧/秒的帧速下的速度提取。遗憾的是它仅能提供运动边缘的法向速度估计,为了恢复整个模式的光流场,还必须用速度泛函方法将估计的法向流整合成一个致密的光流场。尽管用这些神经动力学模型来测量光流还很不成熟,然而这些方法及其结论为进一步研究打下了良好的基础,是将神经机制引入运动计算方面所做的极有意义的尝试。一并行机上实现了30帧/秒的帧速下的速度提取。遗憾的是它仅能提供运动边缘的法向速度估计,为了恢复整个模式的光流场,还必须用速度泛函方法将估计的法向流整合成一个致密的光流场。 尽管用这些神经动力学模型来测量光流还很不成熟,然而这些方法及其结论为进一步研究打下了良好的基础,是将神经机制引入运动计算方面所做的极有意义的尝试。 目前,对光流的研究方兴未艾,新的计算方法还在不断涌现。这里对光流技术的发展趋势与方向提出以下几点看法: (1)现有技术各有自己的优点与缺陷,方法之间相互结合,优势互补,建立光流计算的多阶段或分层模型,是光流技术发展的一个趋势; (2)通过深入的研究发现,现有光流方法之间有许多共通之处。如微分法和匹配法的前提假设极为相似;某些基于能量的方法等效于区域匹配技术;而相位方法则将相位梯度用于法向速度的计算。这些现象并不是偶然的。Singh指出,现有 各种光流估计方法基本上可以统一在一个框架之中,这个框架将光流信息分成两类:保持信息和邻域信息,光流场的恢复通过两种信息的提取和融合来实现。光流计算的统一框架的研究是这个领域的又一趋势; (3)尽管光流计算的神经动力学方法还很不成熟,然而对它的研究却具有极其深远的意义。随着生物视觉研究的不断深入,神经方法无疑会不断完善,也许光流计算乃至计算机视觉的根本出路就在于神经机制的引入。神经网络方法是光流技术的一个发展方向。 2009/4/7 matlab图形句柄属性总结【转】原文在于雪漫的blog
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
属性名 |
属性说明 |
有效属性值 |
|
窗口位置 | ||
|
Position |
图形窗口的位置与大小 |
有效值:四维向量[left,bottom, width,height] 缺省值:决定于显示 |
|
Units |
用于解释属性Position的单位 |
有效值:inches(英寸) centimeters(厘米) normalized(标准化单位,认为窗口为一长宽都是1) points(点) pixels(像素) characters(字符) 缺省值:pixels |
|
指定类型与外在显示 | ||
|
Color |
窗口的背景颜色 |
有效值:ColorSpec(有效的颜色 参数) 缺省值:取决于颜色表(参见命令colordef) |
|
Menubar |
转换图形窗口菜单条的“开”与“关” |
有效值:none、figure 缺省值:figure |
|
Name |
显示图形窗口的标题 |
有效值:任意字符串 缺省值:‘’(空字符串) |
|
NumberTitle |
标题栏中是否显示’Figure No. n’,其中n为图形窗口的编号 |
有效值:on、off 缺省值:on |
|
Resize |
指定图形窗口是否可以通过鼠标改变大小 |
有效值:on、off 缺省值:on |
|
SelectionHighlight |
当图形窗口被选中时,是否突出显示 |
有效值:on、off 缺省值:on |
|
Visible |
确定图形窗口是否可见 |
有效值:on、off 缺省值:on |
|
WindowStyle |
指定窗口为标准窗口还是典型窗口 |
有效值:normal(标准窗口)、 modal(典型窗口) 缺省值:normal |
|
控制色图 | ||
|
Colormap |
图形窗口的色图 |
有效值:m*3阶的RGB颜色矩阵 缺省值:jet色图 |
|
Dithermap |
用于真颜色数据以伪颜色显示的色图 |
有效值:m*3阶的RGB颜色矩阵 缺省值:有所有颜色的色图 |
|
DithermapMode |
是否使用系统生成的抖动色图 |
有效值:auto、manual 缺省值:manual |
|
FixedColors |
不是从色图中获得的颜色 |
有效值:m*3阶的RGB颜色矩阵 缺省值:无(只读模式) |
|
MinColormap |
系统颜色表中能使用的最少颜色数 |
有效值:任一标量 缺省值:64 |
|
ShareColors |
允许MATLAB共享系统颜色表中的颜色 |
有效值:on、off 缺省值:on |
|
指定透明度 | ||
|
Alphamap |
图形窗口的α色图,用于设定透明度。 |
有效值:m*1维向量,每一分量在[0 1]之间 缺省值:64*1维向量 |
|
指定渲染模式 | ||
|
BackingStore |
打开或关闭屏幕像素缓冲区 |
有效值:on、off 缺省值:on |
|
DoubleBuffer |
对于简单的动画渲染是否使用快速缓冲 |
有效值:on、off 缺省值:off |
|
Renderer |
用于屏幕和图片的渲染模式 |
有效值:painters、zbuffer、OpenGL 缺省值:系统自动选择 |
|
关于图形窗口的一般信息 | ||
|
Children |
显示于图形窗口中的任意对象句柄 |
有效值:句柄向量
|
|
FileName |
命令guide使用的文件名 |
有效值:字符串 |
|
Parent |
图形窗口的父对象:根屏幕 |
有效值:总是0(即根屏幕) |
|
Selected |
是否显示窗口的“选中”状态 |
有效值:on、off 缺省值:on |
|
Tag |
用户指定的图形窗口标签 |
有效值:任意字符串 缺省值:' '(空字符串) |
|
Type |
图形对象的类型(只读类型) |
有效值:'figure' |
|
UserData |
用户指定的数据 |
有效值:任一矩阵 缺省值:[](空矩阵) |
|
RendererMode |
缺省的或用户指定的渲染程序 |
有效值:auto、manual 缺省值:auto |
|
关于当前状态的信息 | ||
|
CurrentAxes |
在图形窗口中的当前坐标轴的句柄 |
有效值:坐标轴句柄 |
|
CurrentCharacter |
在图形窗口中最后一个输入的字符 |
有效值:单个字符 |
|
CurrentOject |
图形窗口中的当前对象的句柄 |
有效值:图形对象句柄 |
|
CurrentPoint |
图形窗口中最后单击的按钮的位置 |
有效值:二维向量[x-coord, y-coord] |
|
SelectionType |
鼠标选取类型 |
有效值:normal、extended、alt、open |
|
回调程序的执行 | ||
|
BusyAction |
指定如何处理中断调用程序 |
有效值:cancel、queue 缺省值:queue |
|
ButtonDownFcn |
当在窗口中空闲点按下鼠标按钮时,执行的回调程序 |
有效值:字符串 缺省值:' '(空字符串) |
|
CloseRequestFcn |
当执行命令关闭时,定义一回调程序 |
有效值:字符串 缺省值:closereq |
|
CreateFcn |
当打开一图形窗口时,定义一回调程序 |
有效值:字符串 缺省值:' '(空字符串) |
|
DeleteFcn |
当删除一图形窗口时,定义一回调程序 |
有效值:字符串 缺省值:' '(空字符串) |
|
Interruptible |
定义一回调程序是否可中断 |
有效值:on、off 缺省值:on(可以中断) |
|
KeyPressFcn |
当在图形窗口中按下一键时,定义一回调程序 |
有效值:字符串 缺省值:' '(空字符串) |
|
ResizeFcn |
当图形窗口改变大小时,定义一回调程序 |
有效值:字符串 缺省值:' '(空字符串) |
|
UIContextMenu |
定义与图形窗口相关的菜单 |
有效值:属性UIContrextmenu的句柄 |
|
WindowButtonDownFcn |
当在图形窗口中按下鼠标时,定义一回调程序 |
有效值:字符串 缺省值:' '(空字符串) |
|
WindowButtonMotionFcn |
当将鼠标移进图形窗口中时,定义一回调程序 |
有效值:字符串 缺省值:' '(空字符串) |
|
WindowButtonUpFcn |
当在图形窗口中松开按钮时,定义一回调程序 |
有效值:字符串 缺省值:' '(空字符串) |
|
访问对象的控制 | ||
|
IntegerHandle |
指定使用整数或非整数图形句柄 |
有效值:on、off 缺省值:on(整数句柄) |
|
HandleVisiblity |
指定图形窗口句柄是否可见 |
有效值:on、callback、off 缺省值:on |
|
HitTest |
定义图形窗口是否能变成当前对象(参见图形窗口属性CurrentObject) |
有效值:on、off 缺省值:on |
|
NextPlot |
在图形窗口中定义如何显示另外的图形 |
有效值:replacechildren、add、replace 缺省值:add |
|
定义鼠标指针 | ||
|
Pointer |
选取鼠标记号 |
有效值:crosshair、arrow、topr、watch、topl、botl、botr、circle、cross、fleur、left、right、top、fullcrosshair、bottom 、ibeam、custom 缺省值:arrow |
|
PointerShapeCData |
定义鼠标外形的数据 |
有效值:16*16阶矩阵 缺省值:将鼠标设置为'custom'且可见 |
|
PointerShapeHotSpot |
设置鼠标活跃的点 |
有效值:二维向量[row,column] 缺省值:[1 1] |
例7-46
>>scrsz = get(0,'ScreenSize');
>>figure('Position',[1 scrsz(4)/2 scrsz(3)/2 scrsz(4)/2])
执行上面的语句,会在屏幕的左上角生成一没有任何符号的窗口。
命令2 line
功能 生成线(line)对象。命令line在当前坐标轴中生成一个线对象。用户可以指定线的颜色,宽度,类型和标记符号等其他特性。
命令line 有两种形式:
1.自动循环使用颜色和类型。当用户用非正式语法来指定矩阵坐标数据:line(X,Y,Z),Matlab将循环使用由坐标轴ColorOrder和LineStyle指定的颜色顺序和类型顺序。
2.纯粹低级操作。当用户用属性名和属性值调用命令line:
line(‘XData’,x,’YData’,y,’ZData’,z)
Matlab将在当前用缺省的颜色(参见命令colordef的使用)画出线对象。注意一点的是,用户不能在命令line的低级形式中使用矩阵数据。
用法 line(X,Y) 在当前的坐标轴中画出由向量x和y定义的线条。若x与y为同型的矩阵,则对于x,y的每一列画出一线条。
line(X,Y,Z) 在三维空间中画出由x,y,z定义的线条。
line(X,Y,Z,'PropertyName',PropertyValue,…) 画出由参数x,y,z确定的线条,其中对指定属性PropertyName设置为PropertyValue,其他没有指定属性用缺省值。属性 LineStyle和Marker参见命令plot。
line('PropertyName',PropertyValue,…) 对属性用相应的输入参数来设置而画出线条。这是命令line的低级使用形式,此时不接受矩阵参数。除了该情形,其他形式都接受矩阵参数。
h = line(…) 返回每一条线的线对象对应的句柄向量。
表7-11
|
属性名 |
说明 |
有效属性值 |
|
定义对象的数据 | ||
|
Xdata |
定义线条的x-轴坐标参量 |
有效值:向量或矩阵 缺省值:[0 1] |
|
Ydata |
定义线条的y-轴坐标参量 |
有效值:向量或矩阵 缺省值:[0 1] |
|
Zdata |
定义线条的z-轴坐标参量 |
有效值:向量或矩阵 缺省值:[0 1] |
|
定义线型与数据点标记符 | ||
|
LineStyle |
定义线条的类型 |
有效值:-、--、:、、-.、 none 缺省值:-(实线) |
|
LineWidth |
定义线条的宽度(以磅为单位) |
有效值:一标量 缺省值:0.5磅 |
|
Marker |
定义标记数据点的标记符号 |
有效值:13种类型之一 缺省值:none |
|
MarkerEdgeColor |
定义标记颜色或可填充标记的边界颜色 |
有效值: auto、none、 ColorSpec 缺省值:auto |
|
MarkerFaceColor |
定义封闭形标记的填充颜色 |
|
|
MarkerSize |
定义标记大小 |
有效值:标量(磅) 缺省值:6(磅) |
|
控制线条的显示 | ||
|
Clipping |
坐标轴矩形区域是否可剪辑 |
有效值:on、off 缺省值:on |
|
EraseMode |
定义显示与擦除线条的方法(对于动画显示) |
有效值:normal、none、 xor、background 缺省值:normal |
|
SelectionHighlight |
当线条被选中时,是否突出显示 |
有效值:on、off 缺省值:on |
|
Visible |
定义线条是否可见 |
有效值:on、off 缺省值:on |
|
Color |
定义线条颜色 |
有效值:ColorSpec |
|
对象访问的控制 | ||
|
HandleVisibility |
定义线条句柄对其他函数是否可见 |
有效值:on、off、callback 缺省值:on |
|
HitTest |
定义线条能否成为当前对象 |
有效值:on、off 缺省值:on |
|
关于线条的一般信息 | ||
|
Children |
线条没有子对象 |
有效值:[](空矩阵) |
|
Parent |
线条对象的父对象为坐标轴对象 |
有效值:坐标轴句柄 |
|
Selected |
是否显示线条的“选中”状态 |
有效值:on、off 缺省值:on |
|
Tag |
用户定义的标签 |
有效值:任一字符串 缺省值:’’(空字符串) |
|
Type |
图形对象的类型(只读类型) |
有效值:'line' |
|
UserData |
用户定义的数据 |
有效值:任一矩阵 缺省值:[](空矩阵) |
|
与回调程序执行有关的属性 | ||
|
BusyAction |
定义如何处理回调中断程序 |
有效值:cancel、queue 缺省值:queue |
|
ButtonDownFcn |
当在线条上按下鼠标时,定义一回调程序 |
有效值:字符串 缺省值:' '(空字符串) |
|
CreateFcn |
当生成线条时,定义一回调程序 |
有效值:字符串 缺省值:' '(空字符串) |
|
DeleteFcn |
当删除线条时,定义一回调程序 |
有效值:字符串 缺省值:' '(空字符串) |
|
Interruptible |
定义回调程序是否可中断 |
有效值:on、off 缺省值:on(可中断) |
|
UIContextMenu |
定义与线条相关的菜单 |
有效值:UIContextMenu的句柄 |
例7-47
>>t = 0:pi/20:2*pi;
>>hline1 = plot(t,exp(t).*sin(t),'k');
>>hline2 = line(t+.06,exp(t).*sin(t),'LineWidth',4,'Color',[.8 .8 .8]);
>>set(gca,'Children',[hline1 hline2])
生成图形为图7-46。
图7-46 命令line画的函数图
例7-48
|
图7-47 随机直线图 |
>>line(rand(4,2),rand(4,2),rand(4,1))
>>line(rand(1,4),rand(1,4),rand(1,4))
>>line(rand(4,1),rand(4,1),rand(4,1))
>>line(rand(2,4),rand(2,4),rand(1,4))
>>line(rand(4,2),rand(4,2),rand(4,1))
生成图形为图7-47。
命令3 patch
功能 生成补片图形对象。该命令为生成补片图形对象的低级图形函数。补片为一个或多个多边形,多边形的顶点为坐标中的点。用户可以指定补片的颜色与光照模式。
用法 patch(X,Y,C) 在当前坐标轴中增加二维带填充模式的补片。参量X,Y确定顶点的位置。若X,Y为矩阵(同型或不同型),系统按列生成多个多边形。若x,y没有定义一封闭 的多边形,则命令自动地将多边形封闭。参量x与y可以定义凹的或自身交叉的多边形。可是,一个不可分隔的补片的边界自身交叉,则不能完整填充。在这种情况 下,最好是将多边形分解成几个小的、自身没有交叉的多边形。参量c指定每一补片的颜色,它可以为简单的ColorSpec,每面一颜色或每一顶点一颜色。 若c为三维列向量,它将被认为是一直接指定的RGB颜色。
patch(X,Y,Z,C) 生成三维的补片对象。
patch(FV) 用结构FV生成一补片。结构FV包含这些域名vertices,faces和可选的facevertecdata,这些域名对应于补片的Vertices属性、Faces属性、FaceVertexCData属性。
patch(…,C,'PropertyName',PropertyValue…) 在二维(X,Y)或三维(X,Y,Z)空间中对补片指定的属性PropertyName设置为PropertyValue。
patch('PropertyName',PropertyValue…) 对所有指定的多个属性PropertyName设置为相应的值PropertyValue。该命令形式可以使用户免除颜色的指定,因为系统将使用缺省的面 颜色和边界颜色,除非用户准确地对属性FaceColor与EdgeColor进行设置。该命令形式也允许用户通过对属性Faces与Vertices的 设置来代替x-,y-与z-轴的输入。
handle = patch(…) 返回命令patch生成的补片对象句柄。
说明 函数patch不象其他的高级的区域生成函数,例如函数fill或area,它没有检测图形窗口与坐标轴的属性NextPlot的设置情形。它只是简单地在当前坐标轴中添加补片对象而已。
有两种指定颜色的补片属性名:
(1)Cdata——当指定x-,y-与z-轴坐标(XData,YData,ZData)时使用;
(2)FaceVertexCData——当指定多边形的顶点与连接矩阵时使用。
以上两个属性接受颜色数据作为索引颜色或者是真颜色(RGB)。其中索引颜色数据 能代表当前色图的直接索引或者代表映射到整个色图的线性数据的比例数值。
命令4 surface
功能 生成面对象。该命令是生成面图形对象的低级函数。面对象为由矩阵元素的A(I,j)所在的行下标I为x-坐标,所在的列下标j为y-坐标,元素值为z-坐标确定的点生成的空间多边形。
用法 surface(Z) 画出由矩阵z确定的曲面,其中z为定义在一几何矩形区域上的单值函数。
surface(Z,C) 画出颜色由c指定的、面由z指定的空间曲面。
surface(X,Y,Z) 曲面由参数x,y,z确定,颜色参数c=z,因此颜色能恰当地反映曲面的高度。
surface(X,Y,Z,C) 曲面由参数x,y,z确定,颜色由参数c确定。
Surface(x,y,Z) 参数x与y为向量,若[m,n]=size(z),则要求length(x)=n,length(y)=m,面上的点由(x(j),y(i),z(I,j))确定。
Surface(x,y,Z,C) 曲面确定如上情形,颜色由参数c确定。
surface(…'PropertyName',PropertyValue,…) 对指定的曲面属性PropertyName指定为PropertyValue,对曲面进行细微控制。
h = surface(…) 返回生成面对象的句柄。
命令5 image
功能 显示图片对象。该命令通过对矩阵c中每一个元素(每一元素作为引用图形色图下标或直接给出RGB值)的解释而生成一个图片对象。Image命令有两种使用格式:
1.一个调用命令newplot的高级函数,可以确定在何处放置图片与坐标轴的范围为刚好围住图片;使刚生成的图片放置在坐标轴的刻度线与格栅线之上;属性Ydir设置为rervse;属性View为[0 90]。
2.一个增加图片到当前坐标轴的低级命令,而没有调用命令newplot,在低级使用形式中,只能对指定属性进行设置操作。
用户在命令的输入参量中可以输入属性名/属性值,结构数组,细胞数组等。
用法 image(C) 把C作为一图片进行显示。C中的每一个元素指定了一个“图片”矩形中的相应部分的颜色。
image(x,y,C) 在(x,y)确定的位置上画C的元素。其中x,y都为2维矩阵,分别指定x轴与y轴的范围,其效果与image(C)相同,只不过是进行了恰当的比例缩放。
image(x,y,C,'PropertyName',PropertyValue,…) 该形式为指定属性名/属性值的高级使用形式,在执行该命令之前,先执行命令newplot。
image('PropertyName',PropertyValue,…) 该形式为低级使用形式,它只接受属性名/属性值的输入。
|
图7-48 |
例7-49
>>load clown
>>image(X,'CDataMapping','scaled')
>>colormap(map)
图形结果为图7-48。
命令6 uicontrol
功能 生成用户控制图形对象(用户界面控制)。也通过该命令运行图形用户界面。当对象被选中时,一般会执行相应的操作。系统支持多种控件,每一种都有不同的作用:
Ÿ 校验框——当单击检验框时,会执行一操作。该组件对于提供用户多个独立的选择是很有用的。要激活一校验框,只需用鼠标单击该组件即可,且选中的状态在组件上显示出来。
Ÿ 可编辑文本框——允许用户输入与修改文本文字的区域。当用户想把文字作为 输入时,可使用该组件。若一可编辑文本框有焦点,则单击文本框的菜单栏不会执行任何操作。因此,在单击菜单条后,语句 get(edit_handle,’String’)并没有返回当前编辑框中的内容。因为系统必须执行回调函数来改变属性 string的值,即使屏幕上显示的文字已经改变。
Ÿ 框架——该组件为一封闭的、可见的、图形窗口区域。框架能使一用户图形界面中相关的控制组件能容易理解。框架没有相关的回调程序。只有控制组件能在框架中 显示。框架不是透明的,因此用户定义的组件先后顺序决定了组件是否被框架遮住或可见。属性Stacking order决定了控制组件的显示顺序:第一个定义的组件最先显示,后面定义的控制组件则覆盖已经存在的组件。若用户要用一框架包围一些组件,则必须第一个 定义框架。
Ÿ 列表框——显示一些项目的列表(用命令string设置),且允许用户选择一个或多个项目。属性Min与Max控制着选择的模式。属性Value显示可选 择的项目与包含着字符串列表中项目的索引;对于选择了多个项目则用向量表示。在任何的能改变属性Value值的、鼠标松开的操作之后,系统MATLAB将 马上执行列表框的回调函数。因此,用户有必要增加一“Done”按钮,用于推迟当要多次选择项目时的操作。在执行列表框回调函数Callback属性之 前,列表框中项目的选择有单击或双击之分,对应于将图形窗口属性SelectionType设置为normal或open。
Ÿ 弹出菜单——当组件被按下时,打开且显示一选择列表(用命令string设置)。当没有打开时,该组件显示当前的选择项。该组件对于用户想给其他用户提供一系列的互斥的选择项,又不想占用太多的区域。
Ÿ 普通按钮——当该组件被按下时,将执行一操作。要激活一按钮,只需在按钮上按下鼠标按钮。
Ÿ 单选按钮——该组件与校验框相类似,但它包含几个互斥的、而且相关的选项(例如在任意时刻,只能选择一个状态)。要激活某一单选按钮,只需在该组件上按下鼠标即可。被选中的组件同时显示出来。
Ÿ 滑块——该组件允许用户通过移动某一范围之内的滑块来输入一指定的数值。用户要移动一滑块,只需在滑块上按下鼠标不放,且在滑块方向上移动;或者是在滑槽 内单击鼠标;或者是单击滑块条上的箭头。当松开鼠标后,滑块所在位置将与一数值对应。用户可以设置滑块的最大值、最小值与当前值等。
Ÿ 静态文本框——显示文本行。静态文本经常作为其他控制对象标签,以提供其他用户相关信息,或者是显示一滑块的数值。其他用户不能交互地改变静态文本,因此对于静态文本,没有相关的回调函数。
Ÿ 触发按钮——当该组件被单击且显示出它们的状态(on或者off)时,控制是否执行回调函数。
用法 handle = uicontrol(parent) 在父对象parent上生成一用户图形控制界面。用户界面控制对象都是图形窗口的子对象,所以当窗口中没有坐标轴时,同样可以放置控制组件于图形窗口中。
handle = uicontrol(…,'PropertyName',PropertyValue,…) 参量PropertyName为属性名,参量PropertyValue可为结构数组或者为单元数组,同时随意地返回刚生成的对象的句柄。当然用户可以通 过命令set与get来设置与询问生成对象的属性值。
附:表7-12列出所有的用于命令uicontrol对象的属性名。每一属性名当作一描述该属性的链接。
表7-12
|
属性名 |
属性名含义 |
属性值 |
|
控制控件类型与显示 | ||
|
BackgroundColor |
对象的背景颜色 |
有效值:ColorSpec 缺省值:与系统有关 |
|
Cdata |
显示于对象之上的真颜色图片 |
有效值:矩阵 |
|
ForegroundColor |
文本字体的颜色 |
有效值:ColorSpec 缺省值:[0 0 0](黑色) |
|
SelectionHighlight |
当对象被选中时突出显示 |
有效值:on、off 缺省值:on |
|
String |
用户控制界面的标签,也是列表框与弹出菜单中的项目 |
有效值:任意有效的字符串 |
|
Visible |
用户界面控制是否可见 |
有效值:on、off 缺省值:on |
|
关于控件对象的一般信息 | ||
|
Children |
用户界面控制界面没有子对象 |
|
|
Enable |
用户界面控制是否可用 |
有效值:on、inactive、off 缺省值:on |
|
Parent |
用户界面控制对象的父对象 |
有效值:图形窗口标量句柄 |
|
Selected |
对象是否为选中状态 |
有效值:on、off 缺省值:off |
|
SliderStep |
滑块步长尺度 |
有效值:二维向量 缺省值:[0.001 0.1] |
|
Style |
用户界面控制对象的类型 |
有效值:pushbutton、edit、togglebutton、slider、text、radiobutton、popupmenu 、listbox、frame 缺省值:pushbutton |
|
Tag |
由用户指定的对象的标记符 |
有效值:任意有效字符串 |
|
TooltipString |
对象的工具提示 |
有效值:任意有效字符串 |
|
Type |
图形对象的类型 |
有效值:字符串(只读) 缺省值:uicontrol |
|
UserData |
用户指定的数据 |
有效值:矩阵 |
|
控制控件对象的位置 | ||
|
Position |
用户界面控制对象的大小与位置 |
有效值:位置矩形 缺省值:[20 20 60 20] |
|
Units |
解释属性position向量的单位 |
有效值:pixels、inches、character、normalized、points、centimeters 缺省值:pixels |
|
控制字体与标签 | ||
|
FontAngle |
字符的倾斜度 |
有效值:normal、italic、oblique 缺省值:normal |
|
FontName |
字体系列名称 |
有效值:字符串 缺省值:与系统有关 |
|
FontSize |
字体大小 |
有效值:一标量 缺省值:与系统有关 |
|
FontUnits |
字体大小单位 |
有效值:pixels、normalized 、inches、centimeters、points 缺省值:points |
|
FontWeight |
文本字体的磅值 |
有效值:light、normal、demi、bold 缺省值:normal |
|
HorizontalAlignment |
标签字符串的对齐方式 |
有效值:left、center、left 缺省值:决定于用户界面控制的对象 |
|
String |
用户控制界面的标签,也是列表框与弹出菜单中的项目 |
有效值:字符串 |
|
控制回调函数的执行 | ||
|
BusyAction |
回调函数中断方式 |
有效值:cancel、queue 缺省值:queue |
|
ButtonDownFcn |
当按钮按下时执行的回调函数 |
有效值:字符串 |
|
Callback |
控制操作 |
有效值:字符串 |
|
CreateFcn |
在对象生成过程中执行的回调函数 |
有效值:字符串 |
|
DeleteFcn |
在对象删除过程中执行的回调函数 |
有效值:字符串 |
|
Interruptible |
回调函数中断的模式 |
有效值:on、off 缺省值:on |
|
UIContextMenu |
与界面控制中的对象相关的菜单(如按下鼠标右键) |
有效值:句柄 |
|
关于当前状态的一般信息 | ||
|
ListboxTop |
第一个显示于列表框中的项目的索引 |
有效值:标量 缺省值:[1] |
|
Max |
最大值(与用户界面控制对象有关) |
有效值:标量 缺省值:与系统有关 |
|
Min |
最小值(与用户界面控制对象有关) |
有效值:标量 缺省值:与系统有关 |
|
Value |
用户界面控制对象的当前值 |
有效值:标量或向量 缺省值:与系统有关 |
|
控制组件的访问 | ||
|
HandleVisibility |
句柄是否可从命令窗口中与GUIs中访问 |
有效值:on、callback、off 缺省值:on |
|
HitTest |
组件是否可由鼠标单击选中 |
有效值:on、off 缺省值:on |
命令7 uimenu
功能 生成图形窗口的菜单中的层次的菜单与下一级子菜单。即增加新的菜单于已经存在的菜单后面,当一菜单项被选中时,该菜单项与它的下一级菜单也将显示。也可用该命令生成与组件相关的菜单。
用法 handle = uimenu('PropertyName',PropertyValue,…) 在当前图形窗口菜单条上用指定的属性PropertyName与相应的属性值PropertyValue创建一菜单,同时将该菜单的句柄赋给 handle。其中两个输入参量可以是结构数组或者是单元数组。用户界面菜单的回调函数属性定义了当用户激活菜单项时,进行的响应操作。
uimenu('PropertyName',PropertyValue,…) 效果同上,但不返回句柄值。
handle = uimenu(parent,'PropertyName',PropertyValue,…) 生成一父菜单的子菜单,或者是生成由parent指定的相关菜单中的菜单项目。若parent不是另外的用户界面菜单对象或用户界面相关菜单对象,而是一 图形窗口,则系统将生成该图形窗口菜单条上的新的菜单。同时将生成的菜单赋值给句柄handle。
uimenu(parent,'PropertyName',PropertyValue,…) 效果同上,但不返回菜单的句柄。
附:表7-13列出了所有对uimenu对象有用的属性,分别按功能进行了分类。每一属性名作为该属性描述的索引。
表7-13
|
属性名 |
属性名描述 |
属性值 |
|
控制控件类型与显示 | ||
|
Checked |
菜单检查记号 |
有效值:on、off 缺省值:off |
|
ForegroundColor |
文本的颜色 |
有效值:ColorSpec 缺省值:黑色[0 0 0] |
|
Label |
菜单标签 |
有效值:任何字符串 |
|
Separator |
分隔线模式 |
有效值:on、off 缺省值:off |
|
SelectionHighlight |
对象选中时是否突出显示 |
有效值:on、off 缺省值:on |
|
Visible |
用户界面菜单是否可见 |
有效值:on、off 缺省值:on |
|
关于对象的一般信息 | ||
|
Acceleratro |
键盘等价字符 |
有效值:任何的字符 |
|
Children |
子菜单的句柄 |
有效值:句柄向量 |
|
Enable |
用户界面菜单是否可用 |
有效值:on、off 缺省值:on |
|
Parent |
用户界面菜单的父对象 |
有效值:句柄 |
|
Tag |
用户指定的对象标记符 |
有效值:任何字符串 |
|
Type |
图形对象类型 |
有效值:字符串read-only 缺省值:uimenu |
|
UserData |
用户指定数据 |
有效值:任何矩阵 |
|
控制对象的位置 | ||
|
Position |
用户界面菜单的相对位置 |
有效值:标量 缺省值:[1] |
|
控制回调程序的执行 | ||
|
BusyAction |
回调程序的中断 |
有效值:cancel、queue 缺省值:queue |
|
ButtoDownFcn |
按钮按下回调程序 |
有效值:字符串 |
|
Callback |
控制操作 |
有效值:字符串 |
|
CreateFcn |
在对象生成期间执行的回调程序 |
有效值:字符串 |
|
DeleteFcn |
在对象删除期间执行的回调程序 |
有效值:字符串 |
|
Interruptible |
回调程序中断模式 |
有效值:on、off 缺省值:on |
|
控制对象的访问 | ||
|
HandleVisibility |
是否可从命令行上访问图形用户界面 |
有效值:on、callback、off 缺省值:on |
|
HitTest |
是否可用鼠标选择 |
有效值:on、off 缺省值:on |
命令1 axes
功能 创建坐标轴图形对象。该命令是创建坐标轴图形对象的低级函数命令。
用法 axes 在当前图形窗口中用缺省的属性值创建一坐标轴图形对象。
axes('PropertyName',PropertyValue,…) 用参量'PropertyName'指定的属性名与用参量PropertyValue指定的属性值创建一坐标轴。对于没有指定的属性名,系统则使用缺省的属性值。
axes(h) 使已经存在的坐标轴h成为当前的坐标轴。同时使坐标轴h为图形窗口中的所有子对象属性(Children property)的第一坐标轴,也使图形窗口的CurrentAxes属性为h。当前坐标轴是图形函数image、line、patch、 surface与text等命令输出图形对象的目的地。
h = axes(…) 返回已经创建的坐标轴对象的句柄。
命令2 cla
功能 清除当前坐标轴。该命令在命令窗口中执行与在回调程序中执行效果是一样的,即它不能区别由callback设置的属性 HandleVisibility,也就是说,当它从一回调程序中执行时,命令cla仅仅删除属性HandleVisibility为on的图形对象。
用法 cla 清除当前坐标轴中所有句柄为不隐藏(例如,图形对象属性HandleVisibility设置为on)的图形对象。
cla reset 无条件地清除当前坐标轴中所有图形对象,且重新设置坐标轴的属性,(除了属性Position和Units)。
命令3 gca
功能 获取当前坐标轴句柄。
用法 h=gca 返回当前图形窗口中的坐标轴句柄。若坐标轴不存在,系统则生成一坐标轴同时返回它的句柄。用户不想得到上面的结果,可以输入get(gcf,’CurrentAxes’)。
当前坐标轴为用户创建坐标轴以下子对象的目的地。有许多图形命令可以在当前坐标轴中画出图形对象,如:plot,text,surf等。改变了当前窗口,相应地改变了当前坐标轴。
命令1 gco
功能 返回当前对象的句柄。“当前对象”为最后用鼠标单击的对象,除了命令uimenus之外。若鼠标没有单击到一图形对象之下的子对象,则该图形对象为“当 前对象”。系统会把当前图形对象的句柄存放于图形的属性CurrentObject之中。当前图形窗口中的当前对象并非总是那些它们的回调函数,而是正在 执行的对象。其他函数的回调中断函数可以改变当前对象或者甚至是当前图形窗口。一些回调函数,如生成命令CreateFcn、删除命令DeleteFcn 与用户界面菜单命令Callback等就没有改变当前图形窗口或者当前对象。
用法 h = gco 返回当前对象的句柄给h。
h = gco(figure_handle) 返回指定窗口figure_handle中的当前对象的值。
命令2 get
功能 获取对象属性。
用法 get(h) 返回由句柄h指定的图形对象的所有属性与相应的当前属性值;
get(h,'PropertyName') 返回由句柄h指定的图形对象的指定属性PropertyName的属性值。
<m-by-n value cell array> = get(H,<property cell array>) 返回由m个图形对象的n个属性值组成的m*n阶的细胞数组,其中m=length(H),且n为指定的属性细胞数组<property cell of array>中包含的属性名个数。
a = get(h) 返回一结构,其中该结构的域名为该对象的属性名,结构的域名值为相应属性的当前值。H必须为标量。若用户没有指定输出参量,则系统将信息显示于屏幕之上。
a = get(0,'Factory') 返回所有能由用户设置的属性的缺省定义值。输出参量a为一结构数组,该结构的域名为对象的属性名,域名值为相应属性的当前值。若用户没有指定输出参量,则系统将信息显示于屏幕之上。
a = get(0,'FactoryObjectTypePropertyName') 返回指定对象类型的指定的属性的缺省属性值。输入参量FactoryObjectTypePropertyName为一关键字,由字符Factory与对 象类型(如:Figure)还有属性名(如:Color)组成:FactoryFigureColor
a = get(h,'Default') 返回由句柄h指定的对象的所有缺省属性值。输出参量a为一结构,该结构的域名为缺省值对应的属性名。若用户没有指定输出参量,则系统将该结构信息显示于屏幕。
a = get(h,'DefaultObjectTypePropertyName') 返回对象类型的指定属性的缺省属性值。输入参量DefaultObjectTypePropertyName为一关键字,该字由字符Default与对象 类型名(例如:Figure)还有具体的属性名(例如:Color)组成:DefaultFigureColor
例7-50
若想获得定义于屏幕之上的图形对象属性LineWidth的缺省属性值,输入:get(0,'DefaultLineLineWidth')
命令3 set
功能 设置对象的属性。
用法 set(H,'PropertyName',PropertyValue,…) 用属性值'PropertyValue'设置关于用参量H标志的对象(一个或多个)的属性名'PropertyName'(一个或多个)。H可以为一句柄 的向量。在这种情形下,命令set可以设置所有对象的属性值。
set(H,a) 用指定的属性值设置由H标志的对象的属性。其中a为一结构数组,该结构数组的域名为对象的属性名,域名值为相应属性名的属性值。
set(H,pn,pv…) 对由H指定的所有对象中指定的细胞数组属性名pn设置为相应的细胞数组属性值pv。
set(H,pn,<m-by-n cell array>) 对于每m个图形对象设置n个属性值,其中m=length(H),n为包含属性名的细胞数组pn中包含的属性名个数。即允许用户对每一对象的指定的属性设置不同的属性值。
a= set(h) 返回句柄h中允许用户设置的属性名与可能的属性值。输出参量a为一结构数组,其域名为对象的属性名,域名值为相应的属性名对应的属性值。若没有指定输出参量a,则系统自动将信息显示于屏幕,h必须为标量。
a= set(0,'Factory') 返回那些用户可以设置缺省值的所有对象的属性名,同时显示可能的属性值,输出参量a为一结构数组,其域名为对象的属性名,域名值为相应的属性名对应的属性值,若没有指定输出参量a,则系统自动将信息显示于屏幕。
a= set(0,'FactoryObjectTypePropertyName')返回指定根对象(0)类型中指定的属性名 ObjectTypePropertyName的所有可能的属性值。输入参量是由固定的关键字Factory、对象类型(如axes)与属性名(如 position等)组成。
a= set(h,'Default') 返回由h标记的对象上缺省设置的值,其中h必须是标量。
a= set(h,'DefaultObjectTypePropertyName') 返回指定对象h的类型中指定的属性名ObjectTypePropertyName的所有可能的属性值。输入参量是由固定的关键字Factory、对象类 型(如axes)与属性名(如position等)组成。
命令4 reset
功能 重新设置图形对象的属性为它们的缺省值。
用法 reset(h) 重新设置由句柄h指定的图形对象的属性为系统为它们设置的初始值。若h为一图形figure,该命令不能重新设置属性 Position,Units,PaperPosition和PaperUnits;若h为一坐标轴axes,该命令不能重新设置属性Position和 Units。
例7-51
reset(gca) %重新设置当前坐标轴的属性。
reset(gcf) %重新设置当前图形的属性。
命令5 delete
功能 删除文件或图形对象。作为一可供选择的函数,用户可从当前目录浏览器(Current Directory browser)中删除文件。要打开该浏览器,从MATLAB桌面上的View菜单中选择Current Directory命令。
用法 delete filename 从磁盘上删除指定的文件filename。参量filename可以是绝对路径或与当前路径相关的路径名。其中可以包括通配符(*)。
delete(h) 删除由句柄h指定的图形对象。该命令无条件地、直接地删除对象,甚至是图形窗口。
delete('filename') 这是第一种情形的函数形式。当文件名包含于字符串filename中时,使用函数形式。
例:
delete(‘D:\MATLABR12\work\*.m’) % 将删除指定目录上的所有.m文件。
命令6 findobj
功能 定位图形对象且返回它们的句柄。用户可用特定的属性值与沿着指定的层次分支来限定搜索条件。
用法 h = findobj返回根对象与它的所有的子孙对象句柄。
h = findobj('PropertyName',PropertyValue,…) 返回属性名PropertyName具有属性值PropertyValue的所有图形对象。用户可指定一对或多对PN与PV值,对此,findobj返回 满足所有条件的那些对象。
h = findobj(objhandles,…) 限定搜索的对象为列表于objhandles中的对象与它们子孙对象。
h = findobj(objhandles,'flat','PropertyName',PropertyValue,…) 限定搜索对象为objhandles中列出的对象,而不包含它们的子孙对象。
命令1 subplot
功能 生成与控制多个坐标轴。把当前图形窗口分隔成几个矩形部分,不同的部分是按行方向以数字进行标号的。每一部分有一坐标轴,后面的图形输出于当前的部分中。
用法 subplot(m,n,p) 将一图形窗口分成m*n个小窗口,在第p个小窗口中创建一坐标轴。则新的坐标轴成为当前坐标轴。若p为一向量,则创建一坐标轴,包含所有罗列在p中的小窗口。
subplot(h) 使句柄h对应的坐标轴称为当前的,用于后面图形的输出显示。
subplot('Position',[left bottom width height]) 在由4个元素指定的位置上创建一坐标轴。位置元素的单位为归一化单位。
h = subplot(…) 返回一新坐标的句柄于h。
命令2 hold
功能 保持当前图形窗口中的图形。该命令是决定是否在当前坐标轴中只能增加新的图形对象还是覆盖原有图形对象。测试保持状态命令为ishold。该命令可以设置当前坐标轴与当前图形的属性NextPlot。若一图形窗口中有多个坐标轴,则每个坐标轴有自己的保持状态。
用法 hold on 保留当前图形与当前坐标轴的属性值,后面的图形命令只能在当前存在的坐标轴中增加图形,即设置当前坐标轴属性NextPlot为add。当必要的时候,坐 标轴的一些属性在增加新图时还是要进行相应的改变。例如,当新图形的数据范围超出了当前坐标轴的范围,则命令会自动地改变坐标轴的范围,使能显示新图形。
hold off 在画新图形之前,重新设置坐标轴的属性为缺省值。off是命令hold命令的缺省值。设置当前坐标轴的属性NextPlot为replace。
hold 在on与off之间转换。即在增加图形与覆盖图形之间切换。当坐标轴不存在时,则生成一坐标轴。同时使当前坐标轴属性NextPlot在add与replace之间切换。
命令3 gcf
功能 获得当前图形窗口的句柄。
用法 h = gcf 返回当前图形窗口的句柄。当前窗口为由命令plot、title与surf等得到的结果。若不存在图形窗口,则系统自动地生成一个,并返回它的句柄。若用 户想当图形窗口不存在时,也不创建新的,则输入:get(0,'CurrentFigure')
命令4 clf
功能 清除当前图形窗口。该命令在命令窗口中执行与在回调程序中执行效果是一样的,即它不能区别由callback设置的属性 HandleVisibility,也就是说,当它从一回调程序中执行时,命令clf仅仅删除属性HandleVisibility为on的图形对象。
用法 clf 清除所有当前图形窗口与窗口中的所有那些句柄为不隐藏(例如它们的属性HandleVisibility为on)的图形对象。
clf reset 无条件地清除当前图形窗口中所有的图形对象,且重新设置所有图形窗口属性为缺省值,除了属性Position,Units,PaperPosition,PaperUnits。
命令5 close
功能 删除指定的图形窗口。
用法 close 删除当前的图形窗口。
close(h) 删除由句柄h指定的图形窗口。若h为一向量或矩阵,则close全部删除其中每一分量指定的图形句柄。
close name 删除指定名字name的窗口。
close all 删除所有没有隐藏的图形。
close all hidden 删除所有具有隐藏的图形。
status = close(…) 若成功地删除了指定的对象则返回status=1,否则返回0。
命令6 newplot
功能 做好开始画新图形对象的准备。在高级图形m-文件的开始使用该命令,用于确定在哪一个图形窗口与坐标轴中输出图形。调用命令newplot能改变当前窗口与坐标轴。基本上,当要在已经存在的窗口与坐标轴中画图,有三个选项可选:
1.没有改变任何属性与删除任何对象,直接在当前坐标轴中增加新的图形对象;
2.在画图形的对象之前,删除所有存在于当前坐标轴中的,句柄为非隐藏的对象;
3.在画图形的对象之前,无条件删除所有的存在于当前坐标轴中的对象(不管句柄是否为隐藏),同时设置大部分的属性为缺省值;
4.首先,newplot读取当前图形的属性NextPlot的属性值(关于该属性的含义参见figure或axes的属性表),再执行相应的动作;
5.然后,newplot确定在哪一个窗口中画图,它读取当前图形的属性NextPlot的属性值,执行相应的操作。
用法 newplot 画好图形窗口与坐标轴,后面的图形命令就可以在该坐标轴内画图。
h = newplot 效果如上,且返回当前坐标轴的句柄给h。
命令1 colormap
功能 设置或获取当前色图。色图为一个m*3的、元素在0到1之间的实数的矩阵,每一行为定义一个颜色的RGB向量。色图矩阵的第k行定义了第k个颜色,其中 map(k,:)=[r(k) g(k) b(k)]指定了组成该颜色中红色、绿色、兰色的强度。
用法 colormap(map) 通过矩阵map设置色图。若矩阵map中的元素不在[0 1]区间之内,则返回一个错误。在目录color中的m-文件能够生成许多色图,每一个m-文件能够接受颜色数作为函数参数,例如命令 colormap(hsv(64))生成了有64种颜色的hsv色图。若用户没有指定颜色数,例如命令colormap(hsv),生成与当前色图中颜色 数相同的hsv色图。MATLAB支持的色图见表7-14。
表7-14
|
色图名称 |
包含的颜色范围 |
|
Cool |
青蓝和洋红的色度 |
|
Bone |
带一点蓝色的灰度 |
|
Flag |
交替为红色、白色、蓝色和黑色 |
|
Jet |
Hsv的一种变形(以兰色开始和结束) |
|
Copper |
线性铜色度 |
|
Hsv |
色彩饱和值(以红色开始和结束) |
|
Hot |
从黑色到黄色到白色 |
|
Gray |
线性灰度 |
|
Pink |
粉红的彩色度 |
|
Prim |
三棱镜。交替为红色、橘黄色、黄色、绿色和天蓝色 |
|
Lines |
线性色图 |
|
White |
全白色图 |
|
Colorcube |
增强立方色图 |
|
Autumn |
红色黄色阴影色图 |
|
Spring |
洋红黄色阴影色图 |
|
Summer |
绿色黄色阴影色图 |
|
Winter |
兰色绿色阴影色图 |
例7-52
colormap('default') 设置当前色图为缺省色图。
cmap = colormap 获取当前色图矩阵。
命令2 bone
功能 生成带淡兰色的灰度刻度化的色图。
用法 bone(m) 返回个一个阶数为m*3的包含“bone”的色图。
bone 返回一个与当前色图行数相同的色图。
命令3 cool
功能 生成带阴影的青色和品红的色图。
用法 cool(m) 返回一个阶数为m*3的包含“cool”的色图。
cool 返回一个与当前色图行数相同的色图。
命令4 copper
功能 生成线性铜色色图。
用法 copper(m)返回一个阶数为m*3的包含“copper”的色图。
copper 返回一个与当前色图行数相同的色图。
命令5 flag
功能 生成一个颜色顺序为红、白、兰、黑的色图。
用法 flag(m)返回一个阶数为m*3的包含“flag”的色图。增加m的值,会增加色图的颗粒程度。
flag 返回一个与当前色图函数相同的色图。
命令6 gray
功能 生成一个线性灰度化的色图。
用法 gray(m)返回个一个阶数为m*3的包含灰度化的的色图。
gray 返回一个与当前色图函数相同的色图。
命令7 hot
功能 生成一个颜色顺序为黑、红、黄、白的色图。
用法 hot(m)返回个一个阶数为m*3的包含“hot”的色图。
hot 返回一个与当前色图函数相同的色图。
命令8 hsv
功能 生成一个包含色度-饱和度值的色图。一个hsv色图包含各种饱和色度颜色的色度的成分。其颜色从红色到黄色、绿色、青色、蓝色、品红,最后返回红色。该色图对于显示周期函数很有用处。
用法 hsv(m)返回个一个阶数为m*3的包含hsv的色图。
hsv 返回一个与当前色图函数相同的色图。
命令9 jet
功能 不同于hsv色图的另外一种色图。
用法 jet(m)返回个一个阶数为m*3的,与hsv(m)不同的色图,用于显示NCSA流体激光图片。
jet 返回一个与当前色图函数相同的色图。
命令10 pink
功能 生成一个带柔和阴影粉红色图。
用法 pink(m)返回一个阶数为m*3的包含“pink”的色图。
pink 返回一个与当前色图函数相同的色图。
命令11 prism
功能:生成一个三棱镜色图。如同hsv色图一样,prism色图中的颜色使用顺序是一样的,不同的是,命令prism重复使用它的六中颜色,而命令hsv是连续地变换它的颜色。
用法 prism(m)返回一个阶数为m*3的包含六种循环使用的颜色:红色、橙色、黄色、绿色、蓝色、紫色。
prism 这种没有任何输入输出参量的形式,改变当前坐标轴中的线对象的颜色为三棱镜中的颜色。
命令1 brighten
功能 增亮或变暗色图。
用法 brighten(beta) 增亮或变暗当前的色图。若0<beta<1,则增亮色图;若-1<beta<0,则变暗色图。改变的色图将代替原来的色图,但本质上是相同的颜色。
brighten(h,beta) 对指定的句柄对象h中的子对象进行操作。
newmap = brighten(beta) 该命令没有改变当前图形的亮度,而是返回变化后的色图给newmap。
newmap = brighten(cmap,beta) 该命令没有改变指定色图cmap的亮度,而是返回变化后的色图给newmap。
命令2 colorbar
功能 显示能指定颜色刻度的颜色条。且调整当前坐标轴,以适应当前的颜色条。
用法 colorbar 更新最近生成的颜色条。或若当前坐标轴没有一颜色条,则在右边显示一垂直的颜色条。
colorbar('vert') 增加一垂直的颜色条到当前的坐标轴。
colorbar('horiz') 增加一水平的颜色条到当前的坐标轴。
colorbar(h) 用坐标轴h来生成一颜色条。若坐标轴的宽度大于高度,则颜色条是水平放置的。
h = colorbar(…)返回一颜色条句柄h,该句柄是一坐标轴对象。
colorbar(…,'peer',axes_handle) 生成一与坐标轴axes-handle有关的颜色条,代替当前的坐标轴。
命令3 contrast
功能 提高灰度色图的对比度。该命令可以增强图像的对比度。
用法 cmap = contrast(X) 返回一灰度色图,该色图与当前色图有相同的维数。参量cmap为生成的灰度色图。
cmap = contrast(X,m) 返回维数为m*3的灰度色图cmap。
例7-53
>>load clown;
>>cmap = contrast(X);
>>image(X);
>>colormap(cmap);
命令4 rgbplot
功能 画出色图。
用法 rgbplot(cmap) 画出维数为m*3的色图矩阵cmap的每一列,矩阵的第一列为红色强度,第二列为绿色强度,第三列为蓝色强度。
命令5 diffuse
功能 漫反射率。
用法 R = diffuse(Nx,Ny,Nz,S) 返回曲面的漫反射率向量[Nx,Ny,Nz],S为一三维向量,用于定义光源的方向;S也可以为球面坐标系中的二维向量[Theta,Phi]。
Lambert定律:R = cos(PST),其中PST为曲面法线与光源方向之间夹角。
命令6 specular
功能 镜面反射率。
用法 R = specular(Nx,Ny,Nz,S,V,spread) 返回一曲面的镜面反射率向量[Nx,Ny,Nz],向量参量S与V分别用于指定光源位置与观察点的位置。它们可以为三维直角坐标系向量[x,y,z]或者 为二维球面向量[Theta,Phi]。当标准向量的方向为(S+V)/2,则镜面的高光效果最强。第六个参量spread为镜面反射扩散系数。
命令7 surfl
功能 三维带光照模式的阴影图。图形的色泽取决于曲面的漫反射、镜面反射与环境光照模式。
用法 surfl(…)效果与命令surf(…)基本上一样,除了它受光源影响的曲面之外。
surfl(Z)、surfl(X,Y,Z)、surfl(Z,S)、surfl(X,Y,Z,S)、surfl(X,Y,Z,S,K) 这些都是有效的使用形式。若参数中有S,则为一三维向量[Sx,Sy,Sz],用于指定光源的方向。S也可视为点坐标系下的二维向量[AZ,EL]。S的 缺省值为从当前观察方向逆时针旋转45度。使用命令组cla;hold on;view(AZ,EL);surfl(…);hold off等可画出视角方向为(AZ,EL)的带光照模式的曲面图。第五参数K=[ka,kd,ks,
spread]指定环境光、漫反射光、镜面反射光、扩散系数等的强弱。
surfl(…,'light') 用LIGHT对象生成一带颜色的、带光照模式的曲面。该命令可以生成与用缺省光照模式不同效果的曲面。
surfl(…,'cdata') 指定的曲面的反射光的颜色为cdata。
H = surfl(…) 返回曲面与光源的句柄。
(一)胶皮拍
正胶短齿胶皮拍——在乒乓球拍底板上贴一块胶皮,颗粒向外,颗粒高度在1.5毫米之内。它的主要特点:弹力均匀,击球稳健,易于控制球,但其弹性差,击球速度慢,力量也不够强,可以产生强烈旋转。
(二) 海绵拍
1、 正胶海绵拍——在海绵上贴一块颗粒向外的胶皮,颗粒的高度一般在0.8-1毫米之间,颗粒比较硬,但缺乏粘性。
2、 反胶海绵拍——在海绵上贴一块颗粒向内的胶皮,表面平整柔软,有较大的粘性。它的主要特点:摩擦力大,能击出强烈的旋转球,但反弹力差,回球速度不如正胶海绵拍快,且不易控制转球。
(三)不同性能的乒乓球拍
1、 长胶乒乓球拍——颗粒高度在1.5-1.7毫米之间,颗粒向外,柔软。可直接在底板上贴一块长齿胶皮,也可在薄海绵上加贴一块长齿胶皮。它的主要特点:用长胶拍打球产生的旋转变化,往往使对手难以适应,并引起惧怕心理。它主要依靠来球的旋转或冲力增加回球的旋转强度或旋转变化。用削球回击拉过来的弧圈球,则球更加旋转;对方拉过来的上旋球用挡球回击,则变为下旋球;如来球下旋,用搓或推(拱)回击则变为上旋转;回削一般拉球或对搓时,回球不转;发球多为不转球;控制球能力需要通过长期的训练才能形成,同时击球速度较慢,难以发力攻球。
2、 生胶海绵乒乓球拍——这种乒乓球拍是在较薄的海绵上贴一块生胶皮,其胶体的含胶量比正贴胶皮大,故颗粒比较柔软,弹力较大,颗粒的高度一般在0.8-1毫米之间。它的主要特点:弹性强,摩擦力较小,击出的球速度较快,略下沉,能减弱对方拉弧圈球的威力,在控制球方面有一定的成效;但不易制造差异较大的旋转变化,击球时要更多地依靠运动员本身发力。
3、 防弧海绵乒乓球拍——这种乒乓球拍是在一块结构松、弹力差的海绵上反贴一块厚而硬、粘性小、有些发涩的胶皮。它的主要特点:这种球拍缓冲性能强,可减弱强旋转球的作用,常用于控制对方拉出的弧圈球,但减弱了回球的速度和旋转强度。
乒乓球拍的选择首先要看自己握拍的方法,根据握拍的方法,一般来说分为直拍和横拍两种。
乒乓球产生时欧洲人仿效网球拍的握法,基本上采用横拍,后来乒乓球运动发展到亚洲、产生了直握球拍。 球拍的选择和打法、身体条件等因素密切相关。身材高大的选手,步阔营长,身体移动范围大,中选台优势明显,选择横拍可以大刀阔斧地进攻,发挥力量型的长处。而身材较小的运动员,护台面积小,中远台移动不如身材高的选手范围大。但身材小的反应快,头脑灵活,尤其是台内处理小球快捷多变,选择直拍能有效地发挥其变化多、腕部动作灵活等长处。
怎样选择乒乓球拍,在我们确定了自己的握拍方法后,就要选择使用何种胶皮的海绵拍,这和自身要形成的打法密切相关:
(一)正胶海绵拍。正胶就是胶皮颗粒向上、高度与直径相等的胶皮。这是中国选手最传统的球拍。过去庄则栋、李富荣、江嘉良、谢赛克等一批批世界冠军都采 用正胶海拙扫,26届亚特兰大奥运会冠军刘国梁也是用正胶海绵拍击退了各路好 手。它的特点是弹性好,击球稳且速度快,适合近台快攻型的球员使用。正胶海绵拍不容易吃各种旋转,正是由于粘性小也不容易制造强烈的旋转,所以正胶球拍虽 然拉不出强有力的弧圈球,但是在处理台内旋转球和正手抽杀方面却可以大占便宜。而且由于正胶球速非常快,一般一板就可打死而避免形成相持。如果你觉得自己手腕动作灵活,而大臂和腰腹力量不够,那最好选择以速度制胜的正胶球拍。
(二)生胶海绵拍。生胶就是颗粒向上、直径大于高度的胶皮。其特点是击球有下沉,搓球旋转弱,适合近台选手使用。我们熟悉的王涛,他的反手用的就是生胶, 由于生胶有减转的作用,因此特别容易控制球。尤其是反手拨打台内短球时更是得心 应手,所以像陈静、耿丽娟等都采用反手生胶的打法,以便摆短时求得主动,同时又 能节省体力。王涛的反手弹打如今已成世界一绝,而南朝鲜以玄静和、朴境爱代表的 一批女选手采用直拍生胶的打法更是独树一帜,快速和抢先上手威胁较大。
(三)反胶海绵拍,反胶就是粘贴时向下、粘性较大的光面向上的一种胶皮,这 是现在最常见的球拍,几乎100的欧洲选手均采用此种胶皮,亚洲选手也有近80%使用。 反胶打球的旋转力特强,所以打法以旋转为主的球员(如弧圈球、削球)必谙此道。 瓦尔德内尔、佩尔森、塞弗、马文革等弧圈结合快攻打法、盖亭、王涛、孔令辉等快 攻结合弧圈打法的选手们是清一色的反胶。当然,反胶容易制造旋转,也容易吃转儿,掌握有一定难度。
(四)防守型海绵拍。防守型技术一般以削球为主,也属于旋转型打法,故而横拍削球手正于多以反胶为主,反手则花祥繁多。像丁松,他反手用正胶,削出的球介乎转与不转之间,而且随来球旋转强弱产生变化,令对手判断经常失误。而陈新华反手则采用长胶,这是一种颗粒向上、直径小于高度的胶皮,旋转变化相当大,对方拉过来的球越转,削回去的越转,而且击球下沉,对方不容易借力发力。进攻型球员也经常采用防守型海绵拍以弥补其反手的不足,像蔡振华,他反手使用防守型海绵拍,类似反胶而且无粘性,击球力量减弱,下沉飘忽,令对手难以按常规判断,对弧圈阅球尤为奏效,故而被称为"防弧圈型胶皮"。 对于初学者来说,一般以你最崇拜的运动员的球拍做为自己初学的样板,并且随 著球技的长进,结合自身特点相应变化。这是选择球拍的常用方法。
如何选择海绵与胶皮
底板是球拍的灵魂,当底板定下来后,就可以开始根据自已的打法选择海绵与胶皮了。现在市场上有许多不同品牌的海绵与胶皮,进口名牌产品固然精美,然而国产的反胶中也不乏有许多物美价廉的精品。通常进口的反胶表面涩,出球速度较快,适合快速弧圈球的进攻与对拉球;国产反胶表面粘,有利制造旋转,更加适合拉出有时间差的强烈旋转弧圈球。选择反胶时首先应看它是否经过国际乒联的批准,有无 ITTF 的标志;其次应观察胶面的粘度和是否有杂质。
在选择海绵时除了选择厚度与硬度之外,首先应观察其发泡是否均匀,厚度是否一致,表面是否平整;然后把海绵放在硬的平面上用手指按压,好的海绵应感觉按下去柔和并有顶手的弹力;把海绵放在手上感觉它的重量和活性,然后攥成一团再突然放开,观察海绵展开的速度和展开后涨绵表面的皱痕,弹性好的海绵应该比重较轻,展开速度较快,表面几乎看不到皱痕。
不同厚薄及软硬的海绵性能各不相同。硬海绵较软,海绵吃球时间短,速度快,而软海绵的手感更柔和更好控,由于各人手感不同,在选择海绵的软硬度时,得根据个人的感觉而定。一般来说,太硬的海绵使用者较少,更多的是使用稍软的海绵,这样可以提高击球时的手感。
综上所述,海绵的种类大致分为以下两种:
薄海绵——吃球时间短,出球快,球易透板。由于易透板,会觉得更好控球,加上吃球时间短,使得在近台打球时,速度更快。但缺点是,一旦退到中台,会觉得球的底劲不足,球的前速看似挺快,但落台后的加速度和旋转都较差,给对手的威胁并不大,因而薄海绵更适合在近中台以快攻为主的球友使用。
厚海绵——吃球时间长,吃球深,球的底劲较强,尤其在拉球的时候,厚海绵更能体现它的威力,由于吃球时间长,因而看起来似乎球速比较慢,但球落台后就往下窜,落台后的速度及旋转给对手所带来的压迫感,显然强于薄海绵。因而厚海绵更适合在中远台以拉弧圈为主的球友使用。
胶皮根据颗粒的不同可分为以下五种:
正胶——短颗粒胶皮,特点是弹性好、速度快、击球稳、不易吃转,适合近台快攻,尤其是左推右攻打法,是直板快攻选手最常用的胶皮。如果你觉得自己手腕足够灵活,而大臂和腰腹力量不够,不妨试试以速度制胜的正胶球拍。
反胶——反胶胶皮本身带有较大的粘性,摩擦力强,容易制造旋转,比较好地兼顾了速度与旋转的要求。故弧圈型或弧圈结合快攻型打法使用者较多。同时由于击球稳定,易控制,因此也是初学者的首选,也是时下最流行、最实用的胶皮。
生胶——生胶是颗粒向上、直径大于高度的胶皮。其特点是击球下沉,搓球旋转弱。由于生胶有减转的作用,因此特别容易控制球。对横拍两面攻选手而言,若采用正手反胶 ( 拉弧圈 ) 和反手生胶 ( 快拨及摆短 ) 配置,可获得击球的不同效果,造成对手的不适。
长胶——这是一种颗粒细而长的胶皮,覆盖在薄海绵上面,这种胶皮能使球产生反常的旋转,如:用长胶搓对方的下旋球,球以上旋飞回;推挡对方攻来的上旋球,球以下旋飞回;削对方拉来的弧圈球时回球会更转,而削一般拉球时回球则不转。用这种胶皮打球,对方失误多,自己也不易掌握,大大降低了观赏性和娱乐性。因而,建议年轻人或初学者还是别用了,等老了跑不动时再用吧。
防弧胶皮——“ 防弧胶皮 ” 是专门对付弧圈球的胶皮,这种胶皮胶面无粘性,表面较光滑且轻微发涩,击出的球运行速度较慢、弧线较短,着台后下沉飘忽,令对手难以判断,对付弧圈球尤为奏效。
如何挑选适合自己打法的海绵胶皮:
近台快攻——近台快攻运动员以打速度为主,要求击球弧线低平,因此多采用摩擦少,击打多的发力方式,因而胶皮通常选择正胶或表面的粘性中等,颗粒较短,速度较快的反胶,搭配较软,较薄的海绵。正胶搭配厚度 1.8— 2.1 毫米 ,硬度在35 度左右的海绵;反胶搭配厚度为 1.5— 2.0 毫米 ,硬度在40 度左右的海绵。
弧圈快攻型——当今是弧圈球横行的天下,这是综合了旋转与速度的进攻型打法。多采用打摩结合的 “ 鞭打式 ” 技术。为了保证弧圈进攻的旋转,应该选择表面粘性较好、颗粒略长的反胶;为了保证进攻的速度,应该挑选较硬,较厚的海绵。换打 40mm 大球以来,为了适应球体增大带来的速度变慢、球体变软等情况,运动员们都对自己的海绵进行了调整,适当增加海绵的厚度 ( 2.2mm 以上 ) 、减少海绵的硬度 (45 左右为宜 ) 是当前许多人的共同选择。
快攻结合弧圈进攻型打法——这种打法将快攻技术与弧圈技术结合在一起,具备两种打法的特点,通常使用反胶海绵拍或一面反胶、一面生胶的海绵拍。反胶可选择厚度为 2.1 毫米 、硬度在 45 度左右的海绵,由于多数横板的反手进攻都在近台,所以用于反手击球的海绵应该比正手的薄一些,更利于快攻技术的运用。还有一些人选择使用生胶海绵快攻,相应的海绵应选择 1.8— 2.0 毫米 ,硬度在35 度左右;也有人使用长胶或半长胶进攻。通常选择的海绵厚度为 1.0— 1.5 毫米 ,而且硬度较高,这样既能保持一定的击球速度,又能使回球弧线飘忽下沉。
攻、削结合型打法——这种打法里,有的人将发球抢攻、削中反攻作为主要得分手段;也有的人以削球变化作为主要得分手段,进攻只是一种扰乱对方的战术手段。攻、削结合打法的运动员,由于技术掌握须十分全面,为保证削球与弧圈进攻的旋转,通常选择表面的粘性较好、颗粒略长的反胶;为了保证其削球、防守的良好控制,经常挑选厚度适中 (1.5— 2.0 毫米 ) 并且软、硬适中 (40 度左右 ) 的海绵。
为追求变化,许多人选用两面性能各异的球拍,如一面反胶用于主动变化旋转和进攻,另一面选项用厚度在 0.8 毫米 以下的极薄的海绵配长胶或正胶、生胶;也有人使用防弧胶皮,配合厚度在 1.5 毫米 左右极软的低弹性海绵用于削球控制与变化。
如果你不想费事自己粘海绵和胶皮,可以考虑选购厂家将海绵和胶皮粘好的 “ 套胶 ” ,当然价格也贵些。一般而言,球友在正手比较喜欢用国产套胶,而反手喜欢用进口套胶,因为国产套胶粘,起下旋能力好,适合正手近中台进攻使用,而进口套胶的胶皮涩且出球快,适合要求动作小出球快的反手技术。
|
memest原型 (please type "man memset" in your shell) void *memset(void *s, int c, size_t n); memset:作用是在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法。 常见的三种错误
第一: 搞反了c 和 n的位置.
一定要记住 如果要把一个char a[20]清零, 一定是 memset(a, 0, 20) 第二: 过度使用memset, 我想这些程序员可能有某种心理阴影, 他们惧怕未经初始化的内存, 所以他们会写出这样的代码:
char buffer[20];
memset(buffer, 0, sizeof((char)*20)); 这里的memset是多余的. 因为这块内存马上就被覆盖了, 清零没有意义.
第三: 其实这个错误严格来讲不能算用错memset, 但是它经常在使用memset的场合出现
int some_func(struct something *a){ 问:为何要用memset置零?memset( &Address, 0, sizeof(Address));经常看到这样的用法,其实不用的话,分配数据的时候,剩余的空间也会置零的。
答:1.如果不清空,可能会在测试当中出现野值。 你做下面的试验看看结果()
char buf[5];
CString str,str1; //memset(buf,0,sizeof(buf)); for(int i = 0;i<5;i++) { str.Format(“%d “,buf[i]); str1 +=str ; } TRACE(“%s\r\n“,str1)
2.其实不然!特别是对于字符指针类型的,剩余的部分通常是不会为0的,不妨作一个试验,定义一个字符数组,并输入一串字符,如果不用memset实现清零,使用MessageBox显示出来就会有乱码(0表示NULL,如果有,就默认字符结束,不会输出后面的乱码)
问:
如下demo是可以的,能把数组中的元素值都设置成字符1, 1,第一个程序为什么可以,而第二个不行, 答:
1.因为第一个程序的数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以你输出没有问题。而第二个程序a是整型的,使用memset还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。你看看你输出结果是否这样?
2.如果用memset(a,1,20); |
如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。
举个例子来说明一吧,为了让大家更明白一点,比如一个铅笔盒中有一支笔,但在没有打开之前你并不知道它是什么笔,可能是铅笔也可能是钢笔,这里有两种可能,那么你就可以定义一个枚举类型来表示它!
enum box{pencil,pen};//这里你就定义了一个枚举类型的变量叫box,这个枚举变量内含有两个元素也称枚举元素在这里是pencil和pen,分别表示铅笔和钢笔。
这里要说一下,如果你想定义两个具有同样特性枚举类型的变量那么你可以用如下的两种方式进行定义!
enum box{pencil,pen};
enum box box2;//或者简写成box box2;
再有一种就是在声明的时候同时定义。
enum {pencil,pen}box,box2; //在声明的同时进行定义!
枚举变量中的枚举元素系统是按照常量来处理的,故叫枚举常量,他们是不能进行普通的算术赋值的,(pencil=1;)这样的写发是错误的,但是你可以在声明的时候进行赋值操作!
enum box{pencil=1,pen=2};
但是这里要特别注意的一点是,如果你不进行元素赋值操作那么元素将会被系统自动从0开始自动递增的进行赋值操作,说到自动赋值,如果你只定义了第一个那么系统将对下一个元素进行前一个元素的值加1操作,例如 enum box{pencil=3,pen};//这里pen就是4系统将自动进行pen=4的定义赋值操作!
前面说了那么多,下面给出一个完整的例子大家可以通过以下的代码的学习进行更完整的学习!
#include <iostream>
using namespace std;
void main(void)
{
enum egg {a,b,c};
enum egg test; //在这里你可以简写成egg test;
test = c; //对枚举变量test进行赋予元素操作,这里之所以叫赋元素操作不叫赋值操作就是为了让大家明白枚举变量是不能直接赋予算数值的,例如(test=1;)这样的操作都是不被编译器所接受的,正确的方式是先进行强制类型转换例如(test = (enum egg) 0;)!
if (test==c)
{
cout <<"枚举变量判断:test枚举对应的枚举元素是c" << endl;
}
if (test==2)
{
cout <<"枚举变量判断:test枚举元素的值是2" << endl;
}
cout << a << "|" << b << "|" << test <<endl;
test = (enum egg) 0; //强制类型转换
cout << "枚举变量test值改变为:" << test <<endl;
cin.get();
}
看到这里要最后说一个问题,就是枚举变量中的枚举元素(或者叫枚举常量)在特殊情况下是会被自动提升为算术类型的!
#include <iostream>
using namespace std;
void main(void)
{
enum test {a,b};
int c=1+b; //自动提升为算术类型
cout << c <<endl;
cin.get();
}
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include <assert.h>
void assert( int expression );
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,
然后通过调用 abort 来终止程序运行。
请看下面的程序清单badptr.c:
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
int main( void )
{
FILE *fp;
fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件
assert( fp ); //所以这里不会出错
fclose( fp );
fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败
assert( fp ); //所以这里出错
fclose( fp ); //程序永远都执行不到这里来
return 0;
}
[root@localhost error_process]# gcc badptr.c
[root@localhost error_process]# ./a.out
a.out: badptr.c:14: main: Assertion `fp'' failed.
已放弃
使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include <stdio.h>
#define NDEBUG
#include <assert.h>
用法总结与注意事项:
1)在函数开始处检验传入参数的合法性
如:
int resetBufferSize(int nNewSize)
{
//功能:改变缓冲区大小,
//参数:nNewSize 缓冲区新长度
//返回值:缓冲区当前长度
//说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区
assert(nNewSize >= 0);
assert(nNewSize <= MAX_BUFFER_SIZE);
...
}
2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
好: assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);
3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题
错误: assert(i++ < 100)
这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。
正确: assert(i < 100)
i++;
4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感
5)有的地方,assert不能代替条件过滤
“多普勒效应”是由奥地利物理学家Chrjstian.Doppler首先发现并加以研究而得名的,其内容为:由于波源和接收者之间存在着相互运动而造成接收者接收到的频率与波源发出的频率之间发生变化。
多普勒频移(Doppler Shift)是多普勒效应在无线电领域的一种体现。其定义为:由于发射机和接收机间的相对运动,接收机接收到的信号频率将与发射机发出的信号频率之间产生一个差值,该差值就是Doppler Shift。
设发射机发出的信号频率为(f发),接收机接收到的信号频率为(f收),发射机与接收机之间的相对运动速度为V,C为电磁波在自由空间的传播速度:3×10(8次方)米/秒
则有如下公式:f收=(c±v)/λ=f发±v/λ=f发±f移;(f移)即为多普勒频移,(f移)的大小取决于信号波长λ及相对运动速度V。对某发射机,λ是恒定的,因此相对运动速度V决定了频移的幅度。
无线电发射机输出的射频信号,通过馈线(电缆)输送到天线,由天线以电磁波形式辐射出去。电磁波到达接收地点后,由天线接收下来(仅仅接收很小很小一部分功率),并通过馈线送到无线电接收机。因此在无线网络的工程中,计算发射装置的发射功率与天线的辐射能力非常重要。
Tx是发射( Transmits )的简称。无线电波的发射功率是指在给定频段范围内的能量,通常有两种衡量或测量标准:
1、功率( W ): 相对 1 瓦( Watts )的线性水准。例如,WiFi 无线网卡的发射功率通常为 0.036W ,或者说36mW 。
2、增益( dBm ):相对 1 毫瓦( milliwatt )的比例水准。例如 WiFi 无线网卡的发射 增益 为 15.56dBm 。
两种表达方式可以互相转换:
1、dBm = 10 x log[ 功率 mW]
2、mW = 10[ 增益 dBm / 10 dBm]
在无线系统中,天线被用来把电流波转换成电磁波,在转换过程中还可以对发射和接收的信号进行“放大”,这种能量放大的度量成为 “增益(Gain)”。 天线增益的度量单位为“ dBi ”。由于无线系统中的电磁波能量是由发射设备的发射能量和天线的放大叠加作用产生,因此度量发射能量最好同一度量-增益( dB ),例如,发射设备的功率为 100mW ,或20dBm;天线的增益为 10dBi ,则:
发射总能量=发射功率( dBm )+天线增益( dBi )
= 20dBm + 10dBi
= 30dBm
或者: = 1000mW
= 1W
在“小功率”系统中(例如无线局域网络设备)每个 dB 都非常重要,特别要记住“ 3 dB 法则”。每增加或降低 3 dB ,意味着增加一倍或降低一半的功率:
-3 dB = 1/2 功率
-6 dB = 1/4 功率
+3 dB = 2x 功率
+6 dB = 4x 功率
例如, 100mW 的无线发射功率为 20dBm ,而 50mW 的无线发射功率为 17dBm ,而200mW 的发射功率为 23dBm 。
功率/电平(dBm):放大器的输出能力,一般单位为W、mW、dBm。dBm是取1mW作基准值,以分贝表示的绝对功率电平。
换算公式:
电平(dBm)=10lgW
5W → 10lg5000 = 37dBm
10W → 10lg10000 = 40dBm
20W → 10lg20000 = 43dBm
从上不难看出,功率每增加一倍,电平值增加3dBm
2、dBm, dBi, dBd, dB, dBc都是什么意思,区别是什么?
很多专业书籍的范例中都会出现计算,而往往很多计算结果的意义让我们困惑,就遇到过这种问题不知道家是否被dBm, dBi, dBd, dB, dBc这些术语的意义所困惑,天在这想简单的就我自己的理解介绍一下。
1、dBm
dBm是一个表征功率绝对值的量,计算公式为:10lgP(功率值/1mW)。
[例1] 如果发射功率P为1mW,折算为dBm后为0dBm。
[例2] 对于40W的功率,按dBm单位进行折算后的值应为:
10lg(40W/1mW)=10lg(40000)=10lg4+10lg10+10lg1000=46dBm。
2、dBi 和dBd
dBi和dBd是表征增益的量(功率增益),两者都是一个相对值,但参考基准不一样。dBi的参考基准为全方向性天线,dBd的参考基准为偶极子,所以两者略有不同。一般认为,表示同一个增益,用dBi表示出来比用dBd表示出来要大2.15。
[例3] 对于一面增益为16dBd的天线,其增益折算成单位为dBi时,则为18.15dBi(一般忽略小数位,为18dBi)。
[例4] 0dBd=2.15dBi。
[例5] GSM900天线增益可以为13dBd(15dBi),GSM1800天线增益可以为15dBd(17dBi)。
3、dB
dB是一个表征相对值的量,当考虑甲的功率相比于乙功率大或小多少个dB时,按下面计算公式:10lg(甲功率/乙功率)
[例6] 甲功率比乙功率大一倍,那么10lg(甲功率/乙功率)=10lg2=3dB。也就是说,甲的功率比乙的功率大3dB,则功率大一倍。
[例7] 7/8 英寸GSM900馈线的100米传输损耗约为3.9dB。
[例8] 如果甲的功率为46dBm,乙的功率为40dBm,则可以说,甲比乙大6dB。
[例9] 如果甲天线为12dBd,乙天线为14dBd,可以说甲比乙小2 dB。
4、dBc
有时也会看到dBc,它也是一个表示功率相对值的单位,与dB的计算方法完全一样。一般来说,dBc 是相对于载波(Carrier)功率而言,在许多情况下,用来度量与载波功率的相对值,如用来度量干扰(同频干扰、互调干扰、交调干扰、带外干扰等)以及耦合、杂散等的相对量值。在采用dBc的地方,原则上也可以使用dB替代。
5.31 本科聚了20多个,喝了唱了
6.1,本科第一位结婚喜宴,54人聚了36人,不错了。新娘打扮得很漂亮,本人还能认出来,可是那红酒上的照片怎么看都不像本人了,摄影师这功夫。。嗯
天天猛吃肉,爽,吃得多必然长了几两肉
猛挥菜刀,钝刀割进手指1/4,好处是一直就不用洗菜洗碗了,不过做菜照旧
6.12,又参观一次某些人的宿舍的窝和实验室的窝,晚上10点实验室人气还旺,不错







|
|