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
先验证mcc是否可用,用matlab中的example验证即可
建议不用matlab默认的lcc 编译器(可能有问题),可使用VC6编译器(按默认路径安装)
由于带有界面,需要图像库支持,编译时应使用命令: mcc -B sglcpp pressure
编译生成若干c/c++源码,以及.exe文件、bin目录中figure菜单条/工具条文件(.fig)等
程序发布需要.exe、bin\、.fig

2. 在未装matlab的电脑上运行程序需要数学 运行时库、图像运行时库以及用到的工具箱mex文件
前两者已经在\matlab\extern\lib\win32mglinstaller.exe压缩包中,将其解压,并在环境变量path中添加解压到的路径
另外若程序中还用到其他工具箱的东西,那么需要将此工具箱中需要的mex文件也一并放在解压到的路径,子文件夹位置与matlab中的位置相同

3. 在确保.exe程序可以运行的情况下 可以用setup factory打包发布
以下通过注册表自动添加path路径
%--------------------------------------------------------------------------------------
Screen.Next(); -- 进入下一个屏幕
resultDialog = Dialog.Message("注意", "向环境变量中加入matlab数学库及图象库的安装路径?", MB_YESNO, MB_ICONINFORMATION, MB_DEFBUTTON1);
if (resultDialog == IDYES) then --加入安装路径
strPath = Registry.Get(HKEY_CURRENT_USER, "Environment", "path", true);
if strPath ~= "" then
   strPath = String.Concat(strPath, ";");
end   
strPathToAdd = SessionVar.Expand("%AppFolder%");
strPathToAdd = String.Concat(strPathToAdd,"//MATLAB6p5//bin//win32");  
-- 如果路径中无该位置,则加入
if String.Find(strPath,strPathToAdd) == -1 then  
   strPath = String.Concat(strPath, strPathToAdd);
   Registry.Set(HKEY_CURRENT_USER, "Environment", "path", strPath, REG_SZ);
end
end
%--------------------------------------------------------------------------------------

方法三:
在网上搜了一个方法,还没有用过, 贴在这里仅供参考:
一、 完全可以,而且生成的.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编译产生的可执行图形界面程序运行时的DOS黑窗口的又一种方法

MATLAB Toolbox Path Cache is out of date and is not being used

Warning: MATLAB Toolbox Path Cache is out of date and is not being used.

Type 'help toolbox_path_cache' for more info

照提示键入
>>Type 'help toolbox_path_cache' for more info

看到这里:
To enable this feature,
    
            * Start MATLAB
            * Open the Preferences Dialog under the File menu
            * Click on the word "General"
            * Check the "Enable toolbox cache" item

发现General有一个Update Toolbox Path Cache 按钮
按后重启matlab,问题解决

2009/9/8

纪念NTU-吃住玩篇

NTU的地理位置相对于NUS来说确实算荒郊野外,也就是新加坡的乡下。以前NUS的朋友来我们这,想逛街,看了看JP,说你们这咋啥都没有啊。。。我45度望天,想着,可我咋挺知足的啊叹气

【住篇】
刚来NTU一般都是住校内。校内350一月,GH,valley,heights。GH一般是单间带厕所。也有couple room和双人间,便宜又大,但一般申请不到。厨房冰箱洗衣机都在楼下共用。GH到实验室可以坐B线。我那时住GH2楼靠车站的方向,潮湿的厉害,买的除湿剂几天就满水。下雨后就一直闻到霉味,后来才发现竟然是房间不平,在我床底下积水。每天深夜2点会有飙车一族呼啸而过。6点过后就有199准时的刹车和放屁声。不过这些噪声练就了我强大的容忍态度。他吵他的,我睡我的,不敲我门就不管他汗!valley离N4很近,不用坐车,上山即到(天天爬山也挺锻炼的)。valley的房子是组屋模式,共用厅和厨房,感觉应该挺不错的,但缺点是楼层低,潮湿,而且据说有灵异现象。。。heights从外面看起来挺漂亮,但没进去过。不少老板住在heights里面的教师住宅,所以等车时经常可以看到熟悉的老板身影。

乡下也有乡下的好处,租房便宜!我来的时候NUS附近的common room大概就要500-600,而我租到的第一个小common是81X那边,300包水电网。大家都说我运气好,但大家都忘记了运气是实力的一种微笑

当时大家都租的是350包水电的平均水平,为啥我能租到300水电网,大家一定想知道我有什么秘诀。不想知道?那我也要说。其实是二房东也是刚住过来,不太清楚乡下房价。后来二房东以整套出租为由,让我换地方。可是我在快走时却惊奇的迎来了租我这个单间的一NTU fellow。一问,好家伙,升到450了。。。那小破屋450?不过对于在学校招待所一天80(据他说)来衡量,他给450肯定感觉很幸福谄笑

第二个住处是张宇友情提供的,就是和张宇合租一间,在靠近盛松超市的student hostel,就算加上水电也是350以下。那里曾经是警察宿舍,有一大圈铁栅栏,某人说看起来像监狱囧。这里的好处之一是门卫把守的很严格,必须有学生签证才允许入住。探监的人必须详细登记盘查。让人觉得被关在里面的生活也挺放心的~里面大多是2+1的房,我住的也是,不过也有1+1,是顶层电梯那个位置附近。好处之二是学生氛围。这里面都是学生,也有不少PLMM。。。嘿嘿当然我入住这里绝对不是因为这个害羞。。现在我们实验室有不少人都住那里,平日里开个party都有一堆人了,很是热闹。好处之三是绝对能自己烧饭做菜,这对于我这种不断琢磨菜谱的人来说非常方便。好处之四是靠近盛松啊,好多东西超便宜。不买都不划算。不过也有不好的地方,整套的价格并没优势,我们电梯层(+50)当时是1100。在其他地方租个2+1感觉比这要划算的多。另外空间小,大概都算小common。总之,得自己衡量~

现在住的是pioneer附近550包水电网带空调的大common,这个大家不感兴趣,我就不细说了猫猫笑

【吃篇】
一直觉得canteen就是餐厅的音译。只因为英语里不好发c的音才发成了k。呵呵,大概是巧合吧。校园里的餐厅,A和B是归学校管,带数字的是承包给私人管。结果是很多人都不喜欢到AB,偏向于带数字的餐厅。

A。其实A里的日本饭挺不错呀,起码比JP里B1的马来人做的日本饭正宗不少。虽然觉得第二家碱面不咋地,但貌似永远排队最长。没胃口的时候吃吃手工面也不错,挺鲜的,刺激食欲。但量很少,我吃不饱。。中餐哪里都差不多,有时候有些肉做的还不错。素食,这个我原来是有阴影的,做的那么像肉,而且还提供鸡蛋,我虽然疑惑但也坚信我吃到了肉。我第一次吃完几天后都不能承受我的味觉被欺骗的打击囧。直到某人带我再去尝试,一脸很好吃很营养的模样,我被感化了,从而以坚信吃到的都是豆腐的心态接受了素食。

B。B有个Mr.Bean,卖小饼,豆腐脑和豆浆。对于在国内常喝豆腐脑的人来说,回忆的力量很强大。于是这家很好卖,有时候到下午居然告知豆腐脑卖完了。不过虽然菜单都是英文的,但这家的女服务员,听不懂英文。B里本来老北京的饺子还可以,但现在厨师换了吧,不好吃了。

2。刚来的时候学长跟我说,2那里有supermaket。可我绕着那块看了半天,始终不敢相信那个小卖部被称作了supermaket。现在暂且这么理解吧,在新加坡,啥都要mini一圈。牛肉大王那家是异常火爆,红焖牛肉饭在饿的时候吃是忒满足啊~葱爆牛肉偶尔吃吃很好,味道很浓,吃多了腻味。川菜那家因为觉得所有菜都一个味道,所以没啥兴趣,偶尔来个水煮牛肉还不错。酿豆腐,没胃口的时候喜欢吃,因为它没味道。。。虽说新加坡这里鸡饭据说很有名,但为啥这家鸡饭的老板换的那么勤呢?生意惨淡啊~~~不要问中餐那几个小伙子那绿色的是什么菜,他们不认识,只会跟你说是“蔬菜”,还会嘲笑你连蔬菜都不认识。他们给的量都很少,还会把菜夹到你盘子里,想一想,再夹出去。我极其喜欢吃椰子,can 2有椰子而且帮着砍开,对我来说是极大的满足。不得不提的还有2的夏日霜,之前无法想象沙冰居然能做到如此美味!各种奇特材料专制的磨冰,加上各种玲珑小配料,不得不说是美味。

1。1去的没2多,早期的1除了中餐没啥特色,后来NTU校友开了外婆家,于是麻辣烫火了起来。鸭饭那家的盖浇饭也非常不错。西安小吃那家的面还行,但外加的配菜总给我感觉吝啬。其实西安小吃的砂锅,就是加强版的麻辣烫,非常爽大笑。添一点煮炒,厨师应该是国内来的,功夫非常不错。原来性子急,每次我看到老长的队伍就不愿意等了。后来一尝,嘿,价钱实惠,味道正宗,值!1据说就是中餐的老板娘承包的,1的中餐味道不错,不过相对其他餐厅感觉稍微贵一点。

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出校门后第一站和第二站中间。科大的同学们经常去那吃螃蟹。螃蟹确实好吃,不过毕竟是凉性,多吃胃寒。重点推荐海鲜那家的水晶河粉。这道菜竟然都没列在菜单上,是大家口口相传的。想当初是吴建华师兄带我去吃的。我问为啥不列在菜单里,那里的服务员很拽的说:因为大家都知道啊惊呆。这道菜里,河粉确实晶莹透亮,加入打碎的炒鸡蛋以增加香味,虾是洗净后从中间切成两半的,让你感觉个头极大。另外还有两块鱼肉和两块鱿鱼,都有精制的感觉。河粉里还有很多饱满的绿豆芽。整道菜里用到的食材几乎都是白色的,这也就是“水晶”的含义。6块一份,别觉得贵,口感特别好,吃过你就觉得值了!

盛松旁边的巴沙,需要推荐的首当其冲是韩国料理。这家韩国料理味道一级棒,感觉比校内那家好。拌饭5块一份,包括蘑菇,胡萝卜丝,青菜,鸡蛋等,可选鸡/猪/牛肉,加上韩国特色辣酱,自己搅拌。营养好吃又实惠,包你吃到撑。石锅拌饭,就是加5毛钱,换个黑锅,把饭烧糊点给你,不值得。和韩国料理同一侧,有一家炒菜,只吃过两次,不过牛肉做的很有味道。另一侧的laksa也很好吃,这个味道不是每个人都喜欢。我喜欢也许因为laksa的配料里有椰浆~

JP。翡翠拉面小笼包我很喜欢,自己一个人都去吃过几次。各种中国式的小点会让你回味起很多东西。来来红烧牛肉面(一直觉得这边餐饮人员招揽顾客时候说“来来”很有趣,没想到就有叫这名字的店),面不错,牛肉泡在汤里已经感觉不出红烧了。套餐的配菜,三层肉和肉松炸茄子很好吃,豆腐类的一般化。NewYork的招牌牛排,好大好大的一块啊,特别实惠,不过所有其他的套餐给的都很少。老JP三楼foodcourt不少东西都不错,不一一列举了(现在貌似由于装修而关闭),老JP B1的foodcourt是噩梦。新JP二楼foodcourt外有哈根达斯,味道不用评价。fairprice外有一家酸奶店,各式各样的酸奶让人大饱眼福,味道很享受,不过不要听她们的优惠忽悠,多买你吃不完。JP B1新老连接处的日本街,有不少原味的日本料理,拉面都不错,看起来就有食欲。这里还有新加坡最贵的自助餐,不过只要你有肚子流口水,有money哭,你会觉得物有所值。寿司店琳琅满目,随意挑选。

就火锅而言,这边大多是川味火锅,因为经营方便。只需要买食材,买底料,买调料,买固体酒精。没有任何烹饪技术也不用担心顾客说味道不正。顾客在乎的只有给的肉够不够。所以,川味火锅就不评论了。老百美楼上就有一家,每人只要16.6,不包饮料,但楼下就是超市嘛。而不少人还是执着的坐MRT去kallang吃17-20块一人的火锅,也许那边风景更好,秀色可餐吧。

Chinatown的国府珍锅,是新加坡川味火锅外最好吃的中式火锅,他的海鲜酱非常有名,厨师偶尔配送的小点心都非常好吃。另外有家川菜自助极其赞,量大实惠,每次都感觉能吃到他们亏本,但服务员仍然笑脸相迎,实属不易。名字记不得了,这里的川味饭店取名都很没创意,川 蜀 重庆 这几个字哪家都用,让人绕不清。这家我之前住student hostel时候提过很多遍,没人感兴趣,那我就不管啦。

最近在pioneer的foodcourt吃了药材鸡汤和皮蛋瘦肉粥。我一贯讨厌喝鸡汤,因为鸡汤容易把鸡肉熬的像粉末一样索然无味难以下咽。但这家的药材鸡真是赞,汤虽然微苦却有浓郁的芬芳,香味扑鼻。粥其实做起来不难,但校内总把煮干饭当粥卖,让我一度对新加坡的饮食表示失望。看到粥居然能当特色来开店,苦笑之余,也有点欣慰。这家的粥味道正宗,暖胃,舒心。

【玩篇】
来了这么久,感觉其实自己还挺宅的,没玩多少地方(没关系,以后补上)。一直把新加坡比喻为弹丸大的地方(当然还有更恶心的比喻,这里不说了~),但毕竟是一个国家,还是开发出了很多游玩之地的。说几个地方吧。

圣淘沙,海滩的细沙据说是进口的,也不知道是哪里来的,反正是“国外”的高质量沙子。唱着“浪花一朵朵”在海浪间追逐嬉戏,想起来都是挺雷人的画面。不过挺好玩的~买了套票后有不少景点可以玩,最好玩的要数卡丁车了。一个操纵杆来控制方向和刹车,从山上沿着蜿蜒的坡道冲下来,非常刺激,我冲下来能超越5人耶~(疯子|||)。巨型鱼尾狮是照相的必到之处。鱼尾狮屁股里的法国餐厅好贵啊。圣淘沙这里有个小岛,说是北半球最南端,值得一去,那岛上还有一些很丑陋的santosa的石头字,给人照相。圣淘沙的激光喷泉是亚洲最大规模的激光喷泉。晚上7点和9点各有一场表演(原来不要钱的,现在要啦),就是在喷泉水雾上用激光演绎一段3D的故事。搭配着会有一些火柱喷射效果,虽然隔着20多米远还是觉得好热害羞

动物园safari。听着这儿的人像读拼音一样读这个单词还把最后一个音拖长,会觉得浑身别扭。去的时候是晚上,有东西两个区,一边的镇区之宝是狮子,另一边是大象。主要有两项任务,一是跟着游览小列车去看各类动物,二就是动物表演。在小列车上能碰触到行走在旁边的食蚁兽和猪獾等动物,他们都很拽,瞅都不瞅你一眼。狮子震慑性的吼叫还是会让你胆战心惊,而且,你和他之间看似没有任何防护性阻隔(其实应该有,比如电网啥的)。不安排好时间的话,动物表演就看不到了。木讷的管理人员只要演出开始了就不让人进,但其实位置还是很多的,溜进去照样看。表演途中会有一些假事故发生,不要惊恐。但这些假事故足以把有心脏病的人吓到发病。

Chinatown有很多日本动漫和欧美动漫周边,这让我很奇怪也很感兴趣。不过细看的话你会感觉,大家进货渠道是不是都一样啊,挨着的店几乎说不出区别。所以想淘到好东西还是要气定神闲的慢慢找。

vivocity的夜晚很漂亮,一到周末的晚上,每隔不到10米就坐着一对情侣。在这里,你可以把所有烦心事都放下,静静的看海里月亮的倒影,和友人敞开心扉慢慢聊。

东海岸适合运动,国人用来代步的自行车,在这里是专门用于运动健身的工具。看着有的当地人骑车时不屑的眼神,我就想:偶灵活地穿梭在拥挤的车流中时,你丫还不会骑车呢。当然东海岸还可以溜冰,玩晃晃板,和弹弹乐。沙滩和海水也不错,但没圣淘沙的好。我永远记得这么个情景:大家骑着自行车悠闲的滑行,笑着对我说:你怎么溜冰溜这么慢啊,某人还提议:来,我们飙车吧!然后众人欢笑着远去,丢下我一人在凹凸不平的路上行走。。。哭烧烤要订位置。沿着路可以一直到changi机场。

总统府就是一个高尔夫球场。能看到新加坡总统护卫队一类的军人(还是祖国的国旗护卫队帅)。除了感受资本主义的奢华外,只有我也到此一游的回忆。

我喜欢唱歌,去过k-box,partyworld和topone。k-box的房间很小,可能因为音箱位置问题,两个话筒一起唱容易有啸叫声,很扫兴。按人头算钱。partyworld房间大些,和国内类似按包间算钱,不太有啸叫声,但歌曲没k-box多。topone是新加坡最便宜的ktv了,学生价20,上午11点到晚上6点!唱到你满足为止!而且里面的套餐只要3块钱,一大份,让人难以置信。这家一般不提前2天订位是绝对没位置的。

以上纯属个人感受,如有不妥,欢迎切磋。知道其他好吃好玩的地方请赶紧告诉我,来者不拒。

纪念NTU-CEMNET篇

CEMNET是一个很不错的地方,加入这里,让我有幸能拜会了各路强人。现在要离开了,一定要回味一下。

【研究氛围】
首先,这里学习气氛很浓。如何看出呢?早上8点就有印度人来,9点就有中国人来,不少人还是晚上12点赶着最后一班车走这是多么勤奋的表现啊~要问我为啥知道的这么详细,那是因为我起得早走的晚啊,这应该是全cemnet的人都知道的啊调皮

这里牛人众多,不少人发paper速度极快,水平极高,赞誉极多,让人极其羡慕。同领域的讨论很热烈,很深入。这样才是做研究的地方嘛。当然,牛人也是要靠勤奋的,是要像在校内每天种菜偷菜那样勤奋才行的!在这我得重点感谢翟光涛和段琦。翟光涛在我们lab呆得不久,天天在那调程序写paper,可能认识他的人不多。老段没人不知道吧,哈哈,他们俩对我帮助都很大,诚心感谢!其他兄弟姐妹们对我在学习生活上的关怀和爱护,小弟也会铭记于心!

【娱乐】
我们lab的娱乐活动是丰富多彩的。体育运动有人带队,众人也积极参与,每次打球都是一阵烟(一堆人),气氛很好!现在张宇也成staff了,打球记得找他抢订场地。以后大家打球要记得叫我,只要我有空都会来的!

我们lab外出游玩机会不少,而且每次都有专职摄影师跟团,以优秀的拍摄手法和巧妙的拍摄角度,留下无数成员以外的倩影,回来后供大家欣赏和品味。前段时间太忙没能和大家一起开心,非常遗憾,下次有机会一定不要忘了我!

【我的位置】
虽然不少人觉得自己的位置很不好,但应该都没有我的差吧。区域是最靠近门口的,背对门口,身边是打印机,再旁边是电话机。谁进来后都能看到我在干啥,这个让我很不爽,但也练就了我过人的听力。常在lab活动的人,包括老板,从TECH门口开始我就能听出是谁了,然后决定当前我的窗口是否切换猫猫笑

我不想呆在lab太久,有一个原因就是这打印机。不仅是因为它的噪声,还因为很多人在我身边打印时候都盯着我的屏幕看。我理解,等东西打印好这个时候是很无聊,但是盯着人家做东西盯半天这也很不礼貌吧?不仅看还问,有的不好解释或者不想说的事,就不要纠缠了啊,一个人解释过了,下一个人打印时又来问一遍,下一个人打印时又来问一遍,这样我的时间也就在打印机的噪声和重复解释中过去了晕

我离电话最近,使得我们这块其他人都不愿意接电话。好吧,既然做这里,那就接受这个义务。为了能更好的认人,我还专门照了一张我们lab的人名图,打印后将名字描粗,贴在电话桌上,四边都贴了透明胶固定好。可就是有人打电话时候有毛病,一边打电话一边抠透明胶,然后把纸撕坏。我这是为大家方便才做的,他这是干啥。。。既然这是实验室,那么就要尽量安静吧,有些人打电话嗓门大,时间长,还在电话里吵架生气这让我怎么看。。。

牢骚发完了~按lab的座位说说我接触到的大家吧

高盛华
被叫叠词外号时会非常愤怒。其实这只是熟悉的人玩笑啦,不必太在意。因为过于实在,经常被张宇调戏。很会学,一天半搞定一门课。

王正翔
热衷杀人游戏,因为过人的洞察力而经常被郁闷的首杀。我很替他抱不平,你们就不能第二轮杀他么?说话很自信,经常被实在的盛华调戏。

王欢
我刚来的时候因为不知道名字而以美女来指代这位师姐。接触的确实不多,但从各方面消息总结来看,有一个很好的BF,很会打扮,关注各类打折信息和各类八卦,却又很能在lab坐得住。

胡轶群
这个师兄research能力非常强,英语口语很不错,不仅如此,也乐于钻研一些research外的技术问题和新思路。和他聊天会让人感觉他的观点都是成竹在胸的。不过也挺严厉的,这点他同组的人应该能感觉到吧惊恐

段立新
刚来不久就cvpr这个对一些老同志的打击都挺大的哎。。。看到的都是勤奋工作的身影,就算是开着电影的小窗口也让人觉得不敢打扰

程显刚
活力无限应该是大家对他的一致印象吧,组织活动的活跃份子。把一周7天几乎每天都安排一种体育项目,这种想法已经雷到了众多的人。娱乐科研两不误啊,佩服。

钟峰
一个喜欢无止境开我玩笑的人。我买的零食大多是他吃掉的。我们lab二大水木男之一。水木是一个20%水,80%木的地方,而他就是80%里的。一天里对他来说最大的新闻就是水木上不去了。他说要在我毕业前羽毛球达到灭我的水平,对于这个理想,我很赞许,不过我看还是等你毕业的时候再说吧。

李刚
很热情,还让我们了解了不少新加坡本地人的双语结合说法。活动倡议很积极,群里新闻的主要发布者。不少事情不让他看见他是不会相信的。

滕霄
滕霄有着倾国倾城,连waffle大妈都难以抗拒的妩媚笑容。CEMNET活动摄影师。听说利用摄影认识了不少MM。

黄祎
这个祎真是难写,我手机里没这个字啊。非常勤奋,也会很主动的像他人请教。现在的paper大概够毕业了吧

张宇
做过一段时间的roommate。一个大小孩,一个理想主义者。喜欢开所有人的玩笑,不过他的玩笑有时候会让人无奈或者有暴力冲动。对了,地理知识很赞。

李佳明
说话慢条斯理,很有搞笑潜质。唱歌其实声线不错,但喜欢搞恶,于是结果就是爆笑。他和GF唱歌时抢MAC的镜头至今记忆犹新。

张蓬
蓬哥,话不少。和他聊天,你也许只需要说嗯或者点头就能和他聊上一个钟头。不过他的话题都会很有意思,他会声情并茂的描述,让你无法离开他身边半步。蓬哥其实在很多方面都是高手,但他真人不露相,不会主动表现出来。不过你只要有定力和他聊聊,你就能发现了。。

郭甜甜
和我同期却因为早来几天非要让我叫师姐。很直爽,重感情,喜欢感悟生活。身为南方女孩却让人觉得是北方出身。

张举勇
因喜欢钻研数学,讨论的话题大多为research(也有装的成分)而被称为偶像。不过确实有偶像风范,会以很酷的眼神看你。

李一凡
lab的开心果。有好吃的一定会和大家分享,到处送。感觉是天生的乐天派,啥都会让她high起来。所以只要她绕着lab蹦跳一圈,lab就不沉闷了。

段琦
运动员的身材,不过实际也确实是运动员。篮球的料。羽毛球打起来因为身高臂长,感觉就像铜墙铁壁。帮助他人都挺耐心,沉稳的态度获得老段的尊称。

杨文娴
正宗师姐,强大的research功底让人仰慕。给我做过一段时间的指导,虽然topic没有继续,但还是非常感谢。现在她在特殊时期,大家也要多帮帮她,期待几个月后的成果~

杨盛波
无论何时都能给人以眯眼微笑的表情,CEMNET活动摄影师。不过他的照片里,一般50%是一个人。

张达
憨厚老实,让人觉得很可靠。挺为GF着想,好男人啊。

王丹奇
轮滑高手,虽然还没跟他学到一手。。说话风趣幽默。与GF两地多年终结合,实属难得,祝福佩服。现在LP烧得一手好菜,他太有口福了。

梁山
网球高手。羽毛球和我风格类似,喜欢吊球,说白了就是懒,不想用力吧。前两天看到他给LP打电话用掉的电话卡有一个拳头厚了,震惊了下。。新加坡电信产业感谢您的支持。

陆海峰
因为坐4G,虽然同师门但接触少。和显刚打升级算是绝代双骄。CEMNET活动摄影师。他的笑容很有味道。。

方硕
当时郭甜研究了下,郭甜和我同一老板,郭甜的二老板是方硕大老板。那么和我是远房师门关系。。。好吧。是个挺乐观开朗,挺纯朴的女孩。

 

可能还有一些朋友没有提及,如有漏掉请赶紧提醒我哈,还有的人因为接触不多不甚了解呀。不过我认人认脸,见面一定认识。一生能相遇已经是缘分了,能认识成为朋友更是缘分。我是不会忘记大家的,这都是一生的朋友难过

我这刚走,大家座位就大调整。这个不重要,重要的是紧接着有个庆祝CEMNET调整完毕的聚餐,于是我就没口福了。大家每人给我多吃一口,当帮我吃的好了汗

2009/8/25

matlab GUI调用MediaPlayer播放AVI的尝试

先看了《精通MATLAB GUI设计》 5.4.2的AVI文件执行
按其所说,无效
而后按照http://www.ilovematlab.cn/viewthread.php?tid=46&extra=page%3D1 这里的视频教程编写:
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];
feature('COM_ActxProgidCheck',0);
MovieControl = actxcontrol('WMPlayer.OCX.7',pos);

%Store handle in handles structure
handles.MovieControl = MovieControl;
mp = handles.MovieControl.MediaPlayer;
handles.output = mp;
guidata(hObject, handles);

这是两个主要菜单函数
不过发现有 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
http://blog.sina.com.cn/s/blog_4b9b714a0100cce2.html
这两天在看句柄式图形方面的东西,以下是我在看书过程中整理的学习笔记,比较详细的介绍了句柄以及与其密切相关的各种图形对象和它们的属性。希望能对初学Matlab界面设计的朋友们有所帮助。

GUI学习笔记:

句柄式图形常用函数:
(1)get(h)返回句柄值h所指定的图形对象的所有属性名称与相对应的属性值
(2)a = get(h)返回由句柄值h所指定的图形对象的属性结构数组,并且该数组的字段名称就是该对象的属性名称。
(3)a = get(0,'factory')返回所有能由用户设置的属性的默认定义值。
(4)a = get(0,'FactoryObjectTypePropertyName1','FactoryObjectTypePropertyName2',...)返回指定对象类型指定的属性值,输入参数FactoryObjectTypePropertyName为一个关键词,由字符Factory与图形对象类型(如Figure)还有属性名称(如Color)组成。
a = get(0,'factoryFigureColor')返回Figure对象的Color属性值。
(5)a = get(h,'DefaultObjectTypePropertyName1','DefaultObjectTypePropertyName1',...)返回句柄值为h的对象指定属性的默认值。如“DefaultFigureColor”。
(6)a = get(h,'default')列出h对象的所有属性的默认属性值
(7)a = set(h)返回句柄值h所指定的图形对象的所有属性名称对应的可设置属性值,a为结构数组,存储对象的属性名称,其字段值为相对应的属性值。属性值中用{}括起来的表示默认值。
(8)set(h,a)使用指定的属性值来设置由句柄值h所指定的对象属性,a为结构数组,其字段名称为对象的属性名称,字段值为相对应的属性值。
(9)a = set(0,'factory')返回那些用户可以设置默认值的所有对象的属性,同时显示可设置的属性值。
(10)a=set(0,'FactoryObjectTypePropertyName')返回所有对象中指定的属性名称FactoryObjectTypePropertyName的所有可能的属性值。
(11)a = set(h,'属性名','属性值')设置句柄值为h的对象的与属性名对应的属性值。
(12)set(h,'DefaultObjectTypePropertyName1','DefaultObjectTypePropertyName2',...)对句柄值为h的对象设置特定属性名称的属性默认值。
(13)H = findobj;返回Root对象与其所有子对象的句柄值
(14)H = findobj(h);返回h变量的句柄值
(15)H = findobj(’属性名称‘,’属性值‘);依据对象的属性名称和属性值找出匹配的对象句柄值。
(16)H = findobj(ObjectHandles,’属性名称‘,’属性值‘);根据限定的对象列表找出与对象的属性名称和属性值匹配的对象句柄值
(17)gcf返回当前Figure对象的句柄值
gca返回当前axes对象的句柄值
gco返回当前鼠标单击的句柄值,该对象可以是除root对象外的任意图形对象,并且Matlab会把当前图形对象的句柄值存放在Figure的CurrentObject属性中

Figure对象的属性篇
(1).^是矩阵每个元素的幂乘,^是数的幂乘。
(2)set(handle)列出句柄值为handle的对象的所有属性
get(handle)除列出上述属性外,还列出可以设置的属性
reset(handle)将所有属性改为默认值
delete(handle)删除句柄值为handle的图形对象
(3)利用set(handle,‘属性名称’)获得句柄值为handle的对象的属性名称下所有可设置的属性值
set(gcf,'units):得到[ inches | centimeters | normalized | points | {pixels} | characters ],其中,大括号中是默认值
(4)clf reset;将窗口关闭,并重新设置其属性为默认值。
(5)Closerequestfcn,有效值为字符串或函数句柄(前加@)
当关闭绘图窗口或离开Matlab时,就会定义Closerequestfcn定义的函数
(6)createfcn,当Matlab建立一个对象时(如为figure对象,即打开一个绘图窗口),就会触发createfcn所定义的callback程序。如set(0,'defaultfigurecreatefcn','set(gcbo,''integerhandle'',''off'')');即设置了根对象的默认值,使每次建立figure对象时,都会指定一个非整数的句柄值。(在用户未指定句柄值时)
(7)将当前窗口中在键盘上按下的按键名显示出来。
set(gcf,'keypressfcn','get(gcf,''currentcharacter'')')
(8)color有效值为colorspec
colorspec表:
RGB 简称
[110] y_yellow
[101] m_magenta
[011] c_cyan
[100] r_red
[010] g_green
[001] b_blue
[111] w_white
[000] k_black
(9)linspace(a,b,c):a初始b结束c线性分段次数linspace(a,b)则默认100次
(10)CurrentObject:有效值为图形对象句柄值:返回绘图窗口内当前被鼠标选取的对象的句柄值
(11)currentPoint:有效值[x-坐标,Y-坐标]返回绘图窗口中最后单击鼠标的位置,用get(gcf,'currentpoint')就会返回当前在窗口中单击鼠标的位置
(12)DeleteFcn:有效值:字符串或函数句柄,删除对象(这里为figure)时会触发Deletefcn所定义的Callback程序。
(13)Dockcontrols:有效值为on/off,默认值on,控制窗口的嵌入效果是否可用。
(14)Hittest:有效值on/off,决定能否用鼠标选取对象为当前对象。
(15)Integerhandle:有效值on/off,决定Figure对象句柄值的类型为整数或浮点小数。
(16)Interruptible:有效值on/off,执行过程中需要中断程序而优先执行其他程序时要设该属性为on。即Interrupptible属性是用以控制当Callback执行时是否能被其他事件(如此时鼠标按下其他控制对象)而中断,on是会中断,off时会执行完当前Callback,再去执行其他Callback。
(17)Keypressfcn:有效值为字串或函数句柄。当用户在figure窗口中按下键盘的任意键时,就会执行Keypressfcn所定义的Callback程序。
figure('keypressfcn','fprintf(''当前按下键盘上的%c键\n'',get(gcf,''currentcharacter''))')在这个figure窗口中按下键盘上的按键时就会立即返回对应的字符,依据这个效果就可以决定当字符键被按下时所要执行的操作。
当这个属性指定的值是一个函数句柄时,Matlab就会将这个函数视为一个结构,包含下列字段——character(以当前键盘上按下的按键显示的字符来当作结果),modifier(包含一个或多个识别键盘上按下按键字符名称的细胞数组(如Ctrl,Alt,Shift等),key(显示被按下的键)。
(18)WindowButtonDownFcn:有效值为字符串或函数句柄
当鼠标在绘图窗口内按下鼠标任意键时,将触发WindowButtonDownFcn所定义的Callback以产生相对应的操作。
(19)WindowButtonMotionFcn:有效值为字符串或函数句柄
当鼠标在绘图窗口内按住鼠标任意键移动,将触发WindowButtonMotionFcn所定义的Callback以产生相对应的操作。
(20)WindowButtonUpFcn:有效值为字符串或函数句柄
当鼠标在绘图窗口内释放鼠标任意键时,将触发WindowButtonUpFcn所定义的Callback以产生相对应的操作。
(21)CurrentAxes有效值为当前坐标轴的句柄值,返回当前的坐标轴句柄值。假设某坐标轴句柄值为a_h,可以使用axes(a_h)或set(gcf,'currentaxes',a_h)这两种方式,制定句柄值为a_h的坐标轴为当前坐标轴。
(22)CurrentCharacter:有效值为任意字符,返回用户在绘图窗口中最后输入的一个字符,即刚在键盘上按下的字符键将存储到Currentcharacter中,一般于Keyppressfcn合用。
(23)Currentobject有效值为图形对象的句柄值,返回绘图窗口内当前被鼠标选取的对象的句柄值。
(24)有效值为两元素的向量,[X坐标,Y坐标]
返回绘图窗口中最后单击鼠标的位置,与Windowbuttonmotionfcn,Windowbuttonupfcn合用。使用get(gcf,'currentpoint')就会返回当前在窗口中单击鼠标的位置。

Axes对象的属性
(1)title('new','color','r');给坐标轴命名为new,红色
title({'this title','has 2 '});命名为两行的标题
(2)Units:有效值为pixels/normalized/inches/centimeters/points/characters
决定各种位置属性的度量单位,相对于窗口左下角为基准。当设置为Pixels时,以像素为单位;当设置为normalized时,以坐标为单位,屏幕的左下角为[0,0],右上角为[1.0,1.0]。
(3)grid on:在图像中显示网格。
(4)children:控制axes对象的子对象,即image\light\line\patch\rectangle\surface和text等对象,可通过get(gca,'children')来返回当前坐标轴的子对象构成的句柄值向量。
(5)字体属性:
Fontangle字体角度(正常normal或斜体italic/oblique)
Fontname字体名称
fontsize字体大小(单位由Fontunits决定)
fontunits字体单位(points/normalized/inches/centimeters/pixels)
fontweight字体粗细(normal/bold/light/demi)
gridlinestyle决定坐标轴网格线的样式,‘-’为实线‘- -’为虚线‘:’为点线‘-.’为点虚线
plot(1:10);grid on;set(gca,'gridlinestyle','-.');将当前坐标轴显示的网格线为点-虚线
(6)linewidth 定义X,Y和Z轴的轴线宽度(以点单位定义)
(7)NextPlot:有效值为add|replace|replacechildren,默认为replace
add表示使用当前的坐标轴,把新的图形对象加到此坐标轴中是一般保留的做法,replace表示重新设置坐标轴的所有属性(Position除外),也就是在绘图前会删除当前坐标轴和它的子对象。replacechildren表示移除当前坐标轴中所有子对象,但不重新设置坐标轴的所有属性
(8)Outerposition决定坐标轴外边界的位置。由位置向量[left,bottom,width,height]组成,其中left,bottom表示相对于绘图窗口左下角的位置,width,height表示区域尺寸,默认为[0 0 1 1]
(9)Position由位置向量[left,bottom,width,height]组成,决定坐标轴位置
(10)Tag定义本坐标轴的卷展栏,因为每一个对象都有自己唯一的识别码即tag,以方便findobj函数查找坐标轴句柄值。
(11)visible决定坐标轴是否可见
(12)set(gca,'xgrid','on')绘制X轴垂直网格线
set(gca,'gridlinestyle',':','linewidth',3)设置网格线线条类型和宽度
set(gca,'box','on')将图轴方框绘制出来
(13)set(gca,'xscale','linear');将X轴刻度设为线性
set(gca,'yscale','log');将Y轴刻度设为对数
(14)disp()显示一个数组,但不显示其数组名称
disp(' Corn Oats Hay')
disp(rand(5,3))
which results in
Corn Oats Hay
0.2113 0.8474 0.2749
0.0820 0.4524 0.8807
0.7599 0.8075 0.6538
0.0087 0.4832 0.4899
0.8096 0.6135 0.7741

Pause:pause, by itself, causes M-files to stop and wait for you to press any key before continuing.

实例:plot(1:10);set(gca,'yscale','log');
disp('请按下Enter键');
pause
set(gca,'Yscale','linear');本例是说按下Enter键将Y轴刻度由对数改为线性。
(16)Xtick,Ytick,Ztick:控制X,Y,Z轴坐标刻度记号的位置,即控制坐标轴上刻度记号的位置以及每隔多少值会到下一个刻度记号的位置,同时还需要配合Xticklabel、Yticklabel、Zticklabel属性来调整。详细见例程。
以下设置方式相同:
set(gca,'Xticklabel',{'1';'10';'100'})
set(gca,'Xticklabel','1|10|100')
set(gca,'Xticklabel',[1;10;100])
set(gca,'Xticklabel',['1 ';'10 ';'100'])
(17)Findobj:查找

Line对象
当用户建立一个线对象时,就会触发Createfcn所定义的Callback产生相对应的操作;同样,若删除一个线对象时,就会触发DeleteFcn所定义的Callback产生相对应的操作。以下程序建立一个线对象,并设置DeleteFcn为一个问题对话框,当删除该线对象时,就会显示其问题对话框来询问用户。
(1) clipping:有效值为on/off,默认值为on
设置坐标轴土筐是否可以剪辑,如果设为off,则绘制线对象时可超出坐标轴的图框。
(2)Linewidth:有效值为纯量(与向量相对,只有大小而无方向),点为单位。
(3)Marker:有效值为字符,决定Line对象的记号类型,有+,o,*,.,x,s,d,等
(4)Markersize:有效值为纯量,单位为点,Marker的大小。
(5)UIcontextmenu:有效值为uicontextmenu对象的句柄值,定义与线对象相关联的uicontextmenu菜单,因此当用户将该线对象的属性UicontextMenu设置为相关联的uicontextmenu对象的Tag名称时,uicontextmenu就可以在该线对象上单击鼠标右键来显示uicontextmenu菜单。
(6)Tag:有效值为字符串,定义改线对象的卷展栏(即标记)
(7)Type:有效值为字符串(只读),此处为’line‘字符串。
(8)Xdata,Ydata,Zdata:有效值为坐标数组,指定产生线条的数据点,若为2D环境则Xdata、Ydata需要有相同数目的数据,而Zdata为空矩阵;3D环境则Xdata,Ydata,Zdata三者都需要有相同数目的数据。
例:x=0:5,y=x+10;line('xdata',x,'ydata',y);

Patch对象
patch函数不想其他高级区域建立函数(fill和area),只是简单地将patch对象添加到当前坐标轴中而已。
使用:patch(X,Y,C)
在当前的坐标轴中添加二维填充的patch对象,X和Y用以定义patch对象顶点的位置,若X,Y为矩阵,则Matlab按每一行的元素来产生多个多边形。
例:x = [0 0;0 1;1 1];
y = [1 1;2 2;2 1];
z = [1 1;1 1;1 1];(x(1,1),y(1,1),z(1,1)为第一个面的第一个顶点,x(2,1),y(2,1),z(2,1)为第一个面的第二个顶点,以此类推)
tcolor(1,1,1:3) = [1 1 1];
tcolor(1,2,1:3) = [.7 .7 .7];
patch(x,y,z,tcolor);(tcolor是一个1*2*3的三维矩阵)

Surface对象
surface可以建立一个surface对象,surface是由矩阵数据所在的列索引值为X坐标,而行索引值为Y坐标,并且矩阵的每个元素值为Z坐标。

image对象
image(C)将矩阵C当作一个图像来显示,C的每一个元素定义一个图像中矩阵线段的颜色。
image(x,y,C)其中x与y为2元素的向量,分别指定X轴与Y轴卷展轴的范围。C为图像矩阵。

text对象
(1)text(x坐标,y坐标,'string')在图形中指定位置(x,y)显示字符串string。
(2)Editing有效值为on/off,off时,用户在执行GUI操作时无法直接在该Text对象上进行编辑,改为on后,可以进行编辑。
(3)HorizontalAlign 有效值为left/center/right决定Text对象中字符水平方向的对齐方式。
(4)Interpreter有效值为tex/none,决定Text对象中是否可用Tex字符注释,当设置为Tex时,表示允许用户能够在String属性下输入Tex字符。以下为在窗口的 [.5 .5]点位置处建立一个text对象并且字体大小以16点来表示的一个方程式。(显示的是一个二重积分)
text('interpreter','latex','string','$$\int_0^x\!\int_y dF(u,v)$$','position',[.5 .5],'fontsize',16)
(5)String有效值为字符串,表示要显示出来的字符串是什么。
(6)verticalAlignme 有效值为top/cap/middle/baseline/bottom决定Text对象垂直对齐的方式。

下面加载一个例子,是ilovematlab论坛一个斑竹的回复
x=0:0.5:10;
>> y1=sin(x);
>> y2=cos(x);
>> plot(x,y1,'r',x,y2,'g')
>> findobj(gca,'color','r')

不想要的曲线直接delete句柄就可以了

2009/3/25

matlab绘图与图形处理(下)

7.3  通用图形函数命令

7.3.1  图形对象句柄命令

命令1  figure

功能  创建一个新的图形对象。图形对象为在屏幕上单独的窗口,在窗口中可以输出图形。

用法  figure 用缺省的属性值创建一个新的图形对象。

      figure('PropertyName',PropertyValue,…) 对指定的属性PropertyName用指定的属性值PropertyValue(属性名与属性值成对出现)创建一个新的图形窗口,对于那些没有指定的属 性,则用缺省值。属性名与有效的属性值见下表。

      figure(h) 1. 若h为一个已经存在的图形的句柄,则figure(h)使由h标记的图形成为当前图形,使它可见,且在屏幕上把它显示到所有图形之前。当前图形为图像输出的地方。

              2. 若h不是已经存在图形的句柄,但是为一整数,则该命令生成一图形窗口,同时把该窗口的句柄赋值为h;若h不是一图形窗口的句柄,也不是一整数,则返回一错误信息。

      h = figure(…) 返回图形窗口对象的句柄给h。

表7-10

属性名

属性说明

有效属性值

窗口位置

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

      handle = image(…) 返回刚生成的图片对象的句柄。用户可以从上面的任何形式的调用后获得图片句柄。

例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

7.3.2  轴的产生和控制命令

命令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等。改变了当前窗口,相应地改变了当前坐标轴。

7.3.3  图形句柄操作命令

命令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中列出的对象,而不包含它们的子孙对象。

7.3.4  图形窗口的控制命令

命令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。

                                                                                                                           7.4  颜色与光照模式命令

7.4.1  颜色控制命令

命令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 这种没有任何输入输出参量的形式,改变当前坐标轴中的线对象的颜色为三棱镜中的颜色。

7.4.2  色图控制命令

命令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(…) 返回曲面与光源的句柄。

2008/10/16

乒乓球拍的性能及特点

乒乓球拍的性能及特点



(一)胶皮拍

正胶短齿胶皮拍——在乒乓球拍底板上贴一块胶皮,颗粒向外,颗粒高度在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 毫米 左右极软的低弹性海绵用于削球控制与变化。
如果你不想费事自己粘海绵和胶皮,可以考虑选购厂家将海绵和胶皮粘好的 “ 套胶 ” ,当然价格也贵些。一般而言,球友在正手比较喜欢用国产套胶,而反手喜欢用进口套胶,因为国产套胶粘,起下旋能力好,适合正手近中台进攻使用,而进口套胶的胶皮涩且出球快,适合要求动作小出球快的反手技术。

2008/10/2

乒乓球术语的英汉对照

First 第一
Second 第二
Third 第三
Fourth 第四
Fifth 第五
Let 重发球
Fault 犯规
Side 侧面
Net 擦网
Stop 停
Time 时间到
Toss 挑边(掷挑边器)
What is your name? 你叫什么名字?
Which is your choice? 你选择什么?
Yes,you are right. 你是对的
No,you are wrong. 你不对
Who will receive first? 谁先接发球?
Who will serve first? 谁先发球?
Serve 发球
Receive 接发球
Ends 方位
Practice 练习
Begin playing 比赛开始
Ready-Serve 准备---发球
Change service 换发球
Change ends 交换方位
Change receiver 交换接发球员
Point 得分
Good service 合法发球
Good return 合法还击
Outside 出界
Volley 拦击
Obstruct 阻挡
Double hit 连击
Double bounce 两跳
Moved playing surface 台面移动
Free hand on table 不执拍手扶台
Touched net assembly 触及球网装置
Stamp foot 跺脚
Wrong order 次序错了
Edge ball 擦边球
Broken ball 球破裂
Expedite system 轮换发球法
Table 球台
End line 端线
Side line 边线
Centre line 中线
Right half-court 右半区
Playing surface 比赛台面
Top edge 上边缘
Net 球网
Post 支柱
Support 支架
Too high(low) 太高(低)
Ball 球
Select 选择
Recket 球拍
Blade 拍身,底板
Handle 拍柄
Covering 覆盖物
Pimpled rubber 颗粒胶
Sandwich rubber 海绵胶
Too thick 太厚
Playing hall 比赛厅
Surrounds 挡板
Floor 地板
Score indicator 计分器
Towel 毛巾
Dark-coloured 暗色
Matt 无高度光泽
Uniform 一致,均匀
Height 高度
Left 左
Right 右
Best of 3 games 三局二胜
Best of 5 games 五局三胜
Deciding game 决胜局
Match 场
Strick 击球
Recket hand 执拍手
Free hand 不执拍手
Upwards 向上
Near vertically 近乎垂直
Palm of the hand 手掌
Stationary 静止
Above 之上
Below 之下
Behind 之后
Without spin 无旋转
Over or around 越过或绕过
Continue 继续
Server 发球员
Receiver 接发球员
Winner 胜者
Loser 败者
Visible 看得见
Pair 一对(双打运动员)
Player 运动员
Captain 队长
Coach 教练员
Referee 裁判长
Umpire 裁判员
Deputy umpire 副裁判员
Report to referee 报告裁判长
Men's singles 男子单打
Women's singles 女子单打
Men's doubles 男子双打
Women's doubles 女子双打
Mixed doubles 混合双打
Men's team 男子团体
Women's team 女子团体
topspin 上旋球
backspin、underspin 下旋球
sidespin 侧旋球
loop 弧圈球
push 搓球
chop 削球
lob 放高球
Edge ball 擦边球
block 封挡
drive counter counterdrive smash 快攻,打回头,扣杀
drop shot 短吊
junk 防弧圈胶皮
rubber 胶皮
spin 旋转
twiddle 、twirl 倒板
2008/9/9

argc和argv

#include<stdio.h>
main (int argc,char *argv[])
{
int I = 0;
printf("\n命令行中可执行文件名为:%s \n",argv[0]);
printf("\n总共有%d个参数:\n",argc);
while((argc--)>0)
printf("%s \n",argv[I++]);

}
main只有这两个参数。argc表示参数(包括程序名)个数,argv是一个指针数组,其中每个指针指向一个字符串,即一个参数,因此argv[0]就是程序名,argv[1]就是第一个参数
比如 #./sort 1 2
则argc=3,argv[0]是"sort",argv[1]是"1",argv[2]是"2"。
2008/9/8

memset用法详解(转)

 

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(a, 20,  0) 

第二: 过度使用memset, 我想这些程序员可能有某种心理阴影, 他们惧怕未经初始化的内存, 所以他们会写出这样的代码: 

char buffer[20]; 

memset(buffer, 0, sizeof((char)*20)); 
strcpy(buffer, "123"); 

这里的memset是多余的. 因为这块内存马上就被覆盖了, 清零没有意义. 

第三: 其实这个错误严格来讲不能算用错memset, 但是它经常在使用memset的场合出现 

int some_func(struct something *a){ 
 … 
 … 
 memset(a, 0, sizeof(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
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char a[5];
    memset(a,'1',5);
    for(int i = 0;i < 5;i++)
      cout<<a[i]<<"  ";
    system("pause");
    return 0;
}
而,如下程序想吧数组中的元素值设置成1,却是不可行的
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    int a[5];
    memset(a,1,5);//这里改成memset(a,1,5 *sizeof(int))也是不可以的
    for(int i = 0;i < 5;i++)
      cout<<a[i]<<"  ";
    system("pause");
    return 0;
}
问题是:

1,第一个程序为什么可以,而第二个不行,
2,不想要用for,或是while循环来初始化int a[5];能做到吗?(有没有一个像memset()这样的函数初始化)

答:

1.因为第一个程序的数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以你输出没有问题。而第二个程序a是整型的,使用memset还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。你看看你输出结果是否这样? 

2.如果用memset(a,1,20);
就是对a指向的内存的20个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是1000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。

C/C++中枚举类型(enum)

  如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。

  举个例子来说明一吧,为了让大家更明白一点,比如一个铅笔盒中有一支笔,但在没有打开之前你并不知道它是什么笔,可能是铅笔也可能是钢笔,这里有两种可能,那么你就可以定义一个枚举类型来表示它!

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宏的原型定义在<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不能代替条件过滤

2008/9/3

Doppler Shift(多普勒频移)

“多普勒效应”是由奥地利物理学家Chrjstian.Doppler首先发现并加以研究而得名的,其内容为:由于波源和接收者之间存在着相互运动而造成接收者接收到的频率与波源发出的频率之间发生变化。

多普勒频移(Doppler Shift)是多普勒效应在无线电领域的一种体现。其定义为:由于发射机和接收机间的相对运动,接收机接收到的信号频率将与发射机发出的信号频率之间产生一个差值,该差值就是Doppler Shift。

设发射机发出的信号频率为(f发),接收机接收到的信号频率为(f收),发射机与接收机之间的相对运动速度为V,C为电磁波在自由空间的传播速度:3×10(8次方)米/秒

则有如下公式:f收=(c±v)/λ=f发±v/λ=f发±f移;(f移)即为多普勒频移,(f移)的大小取决于信号波长λ及相对运动速度V。对某发射机,λ是恒定的,因此相对运动速度V决定了频移的幅度。

2008/8/25

无线功率mW和dBm换算及常见符号释义

功率单位mW和dBm的换算

无线电发射机输出的射频信号,通过馈线(电缆)输送到天线,由天线以电磁波形式辐射出去。电磁波到达接收地点后,由天线接收下来(仅仅接收很小很小一部分功率),并通过馈线送到无线电接收机。因此在无线网络的工程中,计算发射装置的发射功率与天线的辐射能力非常重要。

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替代。

 
经验算法:
有个简便公式:0dbm=0.001w 左边加10=右边乘10
所以0+10DBM=0.001*10W 10DBM=0.01W
故得20DBM=0.1W 30DBM=1W 40DBM=10W
还有左边加3=右边乘2,如40+3DBM=10*2W,即43DBM=20W,这些是经验公式,蛮好用的。
所以-50DBM=0DBM-10-10-10-10-10=1mw/10/10/10/10/10=0.00001mw
2008/6/14

回家记实

5.31 本科聚了20多个,喝了唱了

6.1,本科第一位结婚喜宴,54人聚了36人,不错了。新娘打扮得很漂亮,本人还能认出来,可是那红酒上的照片怎么看都不像本人了,摄影师这功夫。。嗯

天天猛吃肉,爽,吃得多必然长了几两肉

猛挥菜刀,钝刀割进手指1/4,好处是一直就不用洗菜洗碗了,不过做菜照旧

6.12,又参观一次某些人的宿舍的窝和实验室的窝,晚上10点实验室人气还旺,不错

返回前那晚喂饱了一只家乡的母蚊子
2008/3/17

FileZilla FTP Server安装设置教程

随着宽带网的普及,自己架设FTP服务器进行文件交流的用户越来越多。一提到FTP服务器软件,一般用户首先想到的是大名鼎鼎的Serv-U。使用主流FTP Server存在一个问题:一旦那个软件有什么安全漏洞被公布,由于它的知名度,那么这个安全漏洞也将人尽皆知,这样服务器的安全风险将很大。其实除了这些主流软件之外,还有很多相对不太出名的FTP Server,使用这些比较冷门的FTP Server软件,上述风险相对比较小一些。这里介绍的FileZilla Server是一款免费的开放源代码的软件,具有一般FTP服务器的绝大多数功能。软件支持用户分组;支持流量限制,可以定制按时段的流量限制;支持MODE Z FTP协议;支持远程配置管理…… 安装和设置也比较简单。

首先到官方网站
http://sourceforge.net/project/showfiles.php?group_id=21558
下载最新版本,然后双击安装。出现许可协议,选择“I Agree”同意协议继续……










在这一屏,中间的端口号是管理员登录配置服务器的连接端口号,默认为14147。这个设置还关系到远程登录配置。可以根据自己的情况修改,当然也可以在安装完成之后再修改。








点击Close结束安装,之后弹出连接服务器的窗口。FileZilla Server支持远程配置,如果是从远程进行配置的话,这里的地址、端口号和口令要跟远程服务器上面的对应起来。






本例是从本地登录,密码正确无误之后就进入服务器设置页面。



首先要进行服务器全局参数设置:点“Edit”菜单,选“Settings”
General settings(常规设置):
Listen on Port:监听端口,其实就是FTP服务器的连接端口。
Max.Number of users:允许最大并发连接客户端的数量。
Number of Threads:处理线程。也就是CPU优先级别。数值调得越大优先级越高,一般默认即可。
下面的是超时设置,自上至下分别为:连接超时、传输空闲超时、登入超时。单位为秒。




Welcome message页面设置客户端登录成功以后显示的Welcome信息。建议不要用软件默认的,因为任何软件都不能保证没有什么漏洞,如果在这里暴露软件名称的话,一旦这个FTP Server软件有什么安全漏洞,别有用心的人知道了服务器软件的名称就可能针对性地发起攻击。所以建议这里设置的信息不要包含任何服务器资料




IP Filter(IP过滤器)页面,设置IP过滤规则,在上面栏目中的IP是被禁止的,下面的是允许的。




Passive mode settings(被动传输模式设置):这个页面要重点关注。如果服务器本身直接拥有公网IP,可以选软件默认的“Default”。
倘若服务器是在局域网里面,在一个网关后面,那么就要选择第二项“Use the follwoing IP”,并且在下面的输入栏填写公网的IP地址;否则,客户端用PASV被动模式可能无法连接FTP服务器。因为服务器是在内网中,在客户端使用PASV模式连接服务器的时候,服务器收到连接请求之后需要把自身的IP地址告诉客户端,由于服务器在内网中,它侦测到的IP地址是内网的(如192.168.0.5),它把这个IP地址交给客户端,客户端自然无法连接。在这里设置了指定的IP地址后,服务器就会把这个公网合法的IP地址提交给客户端,这样才能正常建立连接。
如果服务器是动态IP的,那么可以选择下面的“Retrieve external IP address from”,利用FileZilla官方网站免费提供的IP查询页面获取当时的公网合法IP,然后服务器把这个公网合法IP地址提交给客户端。当然静态IP也可以用这个,只不过没有必要。
这个设置页面对服务器位于内网的情况非常重要。有些FTP服务器端没有这个设置项目,客户端就只能用Port主动模式连接。当然有些客户端软件针对这个问题有专门的设置,如FlashFXP的站点设置中只要选中“被动模式使用站点IP”就可以了。
对于在局域网中的服务器,如果服务器没有置于DMZ区,那么强烈建议选中下面的“Use custom port range”定义PASV端口范围。由于PASV模式中,是服务器随机打开端口,然后把打开的端口号告诉客户端,让客户端连接打开的端口。但是因为服务器处于网关后面,如果网关那里没有做对应的端口映射,客户端从外网就无法连接服务器打开的端口,导致PASV模式连接失败。在这里限定服务器打开的端口范围,然后到连接外网的网关那里,对服务器的这些端口做端口映射(虚拟服务)。这需要服务器和Internet网关设备配合设置,这样外网的客户端才能用PASV模式连接进来。






Security settings(安全设置):这里的两个选项关系到能否FXP。软件默认状态“Block incoming server-to-server transfers”和“Block outgoing server-to-server transfers”两项都是选中的,前面那项是禁止连入的服务器对传,后面是禁止传出的服务器对传。也就是说默认状态不允许FXP,如果需要使用FXP,那么就把这两个项目取消选择。注意FXP传输除了跟这个页面的设置有关,还跟IP过滤器有关。




Admin Interface setting(管理员界面设定):这个就是登录配置服务器界面的一些参数。端口号的设置在安装的时候也出现过。下面两栏可以定义允许远程登录配置的网络界面和IP地址。在最下面更改管理员口令。




Logging(日志):设定是否启用日志记录功能以及日志文件大小和文件名。




Speed Limits(速度限制):这个是全局参数,默认状态不限速。可以选中“Constant Speed Limit of”并填写限速数值来实现速度限制,下载(传出)和上传(传入)可以分别设置。还可以根据时段自定义限速规则——“Use Speed Limit Rules”,比如这台服务器或者网络连接除了做FTP服务器之外还有别的用途,需要根据时间调度,不能让FTP传输挤占所有网络带宽影响其它的网络服务;就可以通过这里设置。






Filetransfer compression(文件传输压缩设置):MODE Z FTP协议是一种实时压缩的传输协议。在这种模式下,发送方的数据在发出之前先进行压缩,再送到网络链路中传输,接收方将收到数据实时解包,在本地还原重组成原文件。这种模式可以大幅度减少网络中的数据流量,提升传输效率(速度)。当然对于已经压缩过的文件,就几乎没有效果了。要使用这种传输模式,需要服务器端和客户端都支持MODE Z协议。
勾选“Enable MODE Z support”就可以启用本服务器的MODE Z支持功能,这样,只要客户端也支持MODE Z就可以获得它带来的性能提升。“Minimum allowed compression level”和“Maximum allowed compression level”分别设置最小压缩率和最大压缩率。最下面可以输入不启用MODE Z功能的目标IP。
完成这些设置以后,点击“OK”按钮保存设置并退出服务器全局设置页面返回主界面。





下面要进行的是用户组(Group Settings)设置。在主界面点击第五个按钮或者由“Edit”——“Groups”菜单进入。
组设置是为了便于用户归类管理,相同权限的用户归属到同一个组里面,这样就不用重复多次设置每个用户的权限等参数,简化配置和管理工作。点击右边的“Add”按钮创建新组。





组创建完成以后,点“Shared folders”进入目录权限设置页面。点击中间区域的“Add”按钮添加目录。默认状态添加的第一个目录即为该组用户登录之后看到的主目录(Home Directory),主目录前面有个粗体的“H”标识。目录列表右侧分别是对该目录的操作权限设置,上面是文件权限设置,下面是目录权限设置。如果要改变主目录,只要在列表中选中需要设置为主目录的那个,然后点击“Set as home dir”按钮即可。




设置好主目录之后,再点击“Add”按钮把其余的目录依次设置进来就可以了。不过这里得注意,如果仅仅把别的目录添加进去,那么你用客户端连接之后,会发现除了主目录和它的子目录之外,别的目录都看不见。这是怎么回事?这里要说明一个概念——虚拟路径。所谓虚拟路径,就是在客户端看到的目录结构。由于一个用户只能有一个主目录,别的目录如果不映射成虚拟目录的话,客户端将看不到它。所以只有把除了主目录之外的其它目录,虚拟成主目录的子目录,这样在客户端才能看到。
比如本例,主目录是D:\Downloads,如果不做虚拟路径设置,那么客户端登录进来只能看到主目录里面的内容,还有一个E:\FTPRoot目录下面的东西看不到。如何设置虚拟路径?鼠标右键点击列表中的“E:\FTPRoot”目录,在弹出的菜单里面选“Edit aliases”编辑别名;现在要把E:\FTPRoot目录作为客户端主目录下的FTPRoot目录,那么就在弹出的窗口里面输入“D:\Downloads\FTPRoot”并点击“OK”按钮确定。注意拼写规则,路径的前面部分必须是主目录的绝对路径。这样设置之后,在客户端就可以看到一个“FTPRoot”目录,这个目录其实就是E:\FTPRoot目录。
组设置中的“Speed Limits”和“IP Filter”跟全局设置里面的速度限制和IP过滤器设置方法是一样的,请参照前面的内容。只不过这个是仅仅针对这个组的用户生效。而全局设置是对所有的用户都生效。
设置完毕之后点击“OK”按钮回到主界面。






最后一项就是设置用户(Users)。点击主界面第四个按钮或者由“Edit”——“Users”菜单进入。
点击右边的“Add”按钮创建用户,在“Password”域输入用户口令。然后从“Group membership”栏选择该用户所属的组(Group),这样该用户将继承该组的所有属性/权限,不用再单独一一设置这些参数了。这也是设置组体现的方便性,在用户比较多的时候使用组来分类会使得管理工作更加方便、高效。完毕之后点“OK”按钮保存设置并返回主界面。
当然,也可以设置一个不属于任何组的用户,这样的话,就得单独定制该用户的权限。对于少量特殊用户,可以用这种方式设置。
至此,FileZilla Server的基本设置就完成并可以运行了。






对于初次使用FTP Server软件的用户,本文也可以作为入门参考。其实所有的FTP Server软件安装设置的基本原理都是类似的,掌握了一个之后,别的可以举一反三融会贯通。
2008/3/16

ftp 550错误

文件地址有误。若是英文系统可能是因为文件名是中文缘故,改为英文数字即正常

数字签名和哈希函数

数字签名和哈希函数问题的提出
   懂得一点公钥密码基础知识的人都知道,发信息的人用自己的私钥对所发信息进行加密( Encryption ),接收信息者用发信者的公钥来解密( Decryption ),就可以保证信息的真实性、完整性和不可否认性。(注:这里提到的加密、解密是指密码运算,其目的并非信息保密。)那么,我们也可以笼统地说,以上方法就已经达到了数字签名的目的。因为首先,私钥是发信者唯一持有的,别的任何人不可能制造出这份密文来,所以可以相信这份密文以及对应的明文不是伪造的(当然,发信者身份的确定还要通过数字证书来保证);出于同样原因,发信者也不能抵赖、否认自己曾经发过这份信息;另外,信息在传输当中不可能被篡改,因为如果有人试图篡改,密文就解不出来。这样,用私钥加密,公钥解密的技术方法就可以代替传统签名、盖章,保证了信息的真实性、完整性和不可否认性。
   但是,这样做在实际使用中却存在一个问题:要发的信息可能很长,非对称密码又比较复杂,运算量大,而为了保证安全,私钥通常保存在USB Key或IC卡中,加密运算也是在Key或卡中进行。一般来说,小小的USB Key或IC卡中的微处理器都做得比较简单而处理能力较弱,这样,加密所用的时间就会很长而导致无法实用。
   另外,即使对于网站服务器而言,虽然它的处理能力很强,但服务器要同时处理许许多多签名加密的事情,也同样存在着加密耗时长系统效率低的问题。
   有没有解决这个问题的办法呢?有的,常用的方法是使用哈希函数。

什么是哈希函数
   哈希(Hash)函数在中文中有很多译名,有些人根据Hash的英文原意译为“散列函数”或“杂凑函数”,有些人干脆把它音译为“哈希函数”,还有些人根据Hash函数的功能译为“压缩函数”、“消息摘要函数”、“指纹函数”、“单向散列函数”等等。
1、Hash算法是把任意长度的输入数据经过算法压缩,输出一个尺寸小了很多的固定长度的数据,即哈希值。哈希值也称为输入数据的数字指纹(Digital Fingerprint)或消息摘要(Message Digest)等。Hash函数具备以下的性质:
2、给定输入数据,很容易计算出它的哈希值;
3、反过来,给定哈希值,倒推出输入数据则很难,计算上不可行。这就是哈希函数的单向性,在技术上称为抗原像攻击性;
4、给定哈希值,想要找出能够产生同样的哈希值的两个不同的输入数据,(这种情况称为碰撞,Collision),这很难,计算上不可行,在技术上称为抗碰撞攻击性;
5、哈希值不表达任何关于输入数据的信息。

   哈希函数在实际中有多种应用,在信息安全领域中更受到重视。从哈希函数的特性,我们不难想象,我们可以在某些场合下,让哈希值来“代表”信息本身。例如,检验哈希值是否发生改变,借以判断信息本身是否发生了改变。`

怎样构建数字签名
   好了,有了Hash函数,我们可以来构建真正实用的数字签名了。
   发信者在发信前使用哈希算法求出待发信息的数字摘要,然后用私钥对这个数字摘要,而不是待发信息本身,进行加密而形成一段信息,这段信息称为数字签名。发信时将这个数字签名信息附在待发信息后面,一起发送过去。收信者收到信息后,一方面用发信者的公钥对数字签名解密,得到一个摘要H;另一方面把收到的信息本身用哈希算法求出另一个摘要H’,再把H和H’相比较,看看两者是否相同。根据哈希函数的特性,我们可以让简短的摘要来“代表”信息本身,如果两个摘要H和H’完全符合,证明信息是完整的;如果不符合,就说明信息被人篡改了。
   数字签名也可以用在非通信,即离线的场合,同样具有以上功能和特性。
   由于摘要一般只有128位或160位比特,比信息本身要短许多倍,USB Key或IC卡中的微处理器对摘要进行加密就变得很容易,数字签名的过程一般在一秒钟内即可完成。

哈希函数的安全性
   哈希函数的安全性直接关系到数字签名的安全性,如果哈希函数被攻破,数字签名的有效性就会受到质疑。
   目前,已经发明的Hash函数有多种,如Snefru、N-Hash、LOKI、AR、GOST、MD、SHA等。它们在数学上实现的方法各有不同,安全性也各有不同。目前比较常用的Hash函数是MD5和SHA-1。 MD5哈希函数以512位来处理输入数据,每一分组又划分为16个32位的子分组。算法的输出由4个32位分组组成,将它们级联起来,形成一个128位的固定长度的哈希值,即输入数据的摘要。SHA-1哈希函数在MD4的基础上增加了数学运算的复杂程度,即SHA=MD4+扩展转换+附加轮+更好的雪崩效应(哈希值中,为0的比特和为1的比特,其总数应该大致相等;输入数据中一个比特的变化,将导致哈希值中一半以上的比特变化,这就叫做雪崩效应)。SHA能够产生160位的哈希值。对SHA还没有已知的密码攻击,并且由于它产生的哈希值位数长于MD5,所以它能更有效地抵抗穷举攻击(包括生日攻击)。

   但是,任何一种算法都有其漏洞和局限性。任何一个哈希函数都会存在碰撞——即在一些特定情况下,两个不同的文件或信息会指向同一个数字摘要。在一般情况下,类似碰撞只能尽可能地减少,而不能完全避免。从理论上讲,没有攻不破的密码。随着密码科学的发展,也许会找到攻破某一种密码算法的途径。

   评价Hash算法的一个最好方法是看敌手找到一对碰撞消息所花的代价有多高。一般地,假设攻击者知道Hash算法,攻击者的主要攻击目标是找到一对或更多对碰撞消息。目前已有一些攻击Hash算法和计算碰撞消息的方法。在这些方法中,有些是一般的方法,可用于攻击任何类型的Hash算法,比如“生日攻击”;而另一些是特殊的方法,只能用于攻击某些特殊的Hash算法,比如适合于攻击具有分组链结构Hash算法的“中间相遇攻击”,适用于攻击基于模运算的Hash函数的“修正分组攻击”。坚固的哈希函数可通过设计有效的碰撞处理机制,或增加数字摘要的位数来增加复杂度,以减少碰撞出现的概率,

   2004年8月17日,在美国召开的国际密码学会议(Crypto’ 2004)上,一些国家的密码学者作了破译Hash函数的新进展的报告,其中我国山东大学的王小云教授做了破译MD5、HAVAL-128、MD4、和RIPE MD算法的报告。

   到2005年2月,据王小云教授的研究报告,他们已经研究出了搜索SHA-1碰撞的一系列新技术。他们的分析表明,SHA-1的碰撞能在小于2^69次Hash操作中找到。对完整的80轮SHA-1的攻击,这是第一次在小于2^80次Hash操作这个理论界限的情况下找到碰撞。根据他们的估计,对于缩减到70轮的SHA-1能够用现在的超级计算机找出“实碰撞”。他们的研究方法,能自然地运用到SHA-0和缩减轮数的SHA-1的破译分析上。

   2005年3月6日,Arjen Lenstra,王小云,Benne de Weger 宣布,他们构造出一对基于MD5 Hash函数的X.509证书,产生了相同的签名。他们提出了一种构造X.509证书的方法,在他们所构造出的证书对中,由于使用了MD5算法,签名部分产生了碰撞。因此,当证书发布者使用MD5作为Hash函数时,发布者就会在证书中产生相同的签名,导致PKI的基础原理遭到可信性破坏。这意味着,从单独某个证书无法确定是否存在另一个不同证书有着相同的签名。由于第二个相同签名证书存在的可能性,证书发布机构无法验证私钥的“拥有证明”,即无法验证证书中的签名。因此,使用“基于MD5函数”公钥证书的任何一方都无法确保所谓的证书拥有者是否真实拥有相应的私钥。

   他们也想构造一对基于SHA-1的X.509证书,产生相同的签名。然而,他们还做不到这一点。因为产生SHA-1碰撞还需要相当长一段时间的研究。

   专家指出:A.Lenstra和王小云等人声称已经成功地构造了两张符合X.509证书数据结构,拥有同样签名而内容却不同的证书,但该构造方法对证书的部分域要有特殊安排,签名算法RSA的密钥也是按照特殊规律生成的,要用来攻击某个实际应用的电子签名系统仍需时日。而对于SHA-1算法,说其从理论上被破解都还为时过早,只能说其破解工作取得了重大突破,破解所需要运算次数已从原来设计时估算的2^80次降低为2^69次,这比穷举法快了2048倍,但2^69次运算需要6000年左右的时间,在实际计算上仍然是不可行的。

   除了运算方面的瓶颈外,哈希函数的不可逆性决定了攻击者无法轻易得手,没有人可以保证通过这个发现的每个碰撞都是“可用”的碰撞。在漫长的运算后,你得到的也许包含一些有价值的信息,也许就是理论上存在的单纯碰撞,运算瓶颈和信息匮乏都会使黑客们的种种努力成为徒劳……据业内人士估计,在当前的技术条件下,2^50或2^ 60次运算量的范围内的攻击方法才会为我们带来麻烦,即引发实际意义上的攻击行为。在新研究成果发布前的一段时间内,SHA-1 算法只能被称作不完美,但还是安全的。基于PKI技术进行电子签名的最终用户,目前还不用担心自己的签名被伪造或遭遇签名人抵赖。

   另外,安全专家强调:一种算法被破译,和整个企业的安全系统被攻破,是两个不同的概念。因为随着攻击技术和能力的提高,算法也会“水涨船高”,向前发展进步。王教授所取得的成就提醒密码学家研究新的算法,提醒有关标准化机构要提前修改算法标准,也提醒有关CA和电子签名产品开发商支持新的算法。当然,有些完全基于摘要算法的密押系统和电子货币系统,还需要尽早考虑替换方案。

   美国国家技术与标准局(NIST)曾经发表如下评论:“研究结果说明SHA-1的安全性暂时没有问题,但随着技术的发展,技术与标准局计划在2010年之前逐步淘汰SHA-1,换用其他更长更安全的算法(如:SHA-224, SHA-256, SHA-384和SHA-512)来代替。”