觀點丨關于Matlab的那些事
1.前言
我接觸Matlab的時間比較長了,最開始是在大學里面的數學實驗課上了解了一些,學了些基礎的命令,后來參加過一次數學建模,又自學了點。而后由于所學的專業是生命科學和環境相關的東西,用到matlab的機會不多,主要是一些功能用matlab實現起來不是很方便,而且手邊有現成的軟件可以做到,例如圖像分析,還有DNA序列分析都有現成軟件等。本以為不會與其有太多交集。我下決心學習matlab是在經歷幾件事情之后。當時,在做碩士論文時需要對電泳圖片做微生物種群的多樣性分析和相似性分析,當時手頭的軟件只能將電泳圖轉化為各個泳道的灰度和位置方面的數據,而不能對數據進行分析,而能進行這樣分析的軟件(Bionumerics)比較貴,只為了這個用幾次而買顯然很不劃算。無奈之下,我查了些文獻,了解計算的原理后便用比較熟悉的matlab編程解決這個問題,其實這個程序比較簡單——DGGE中條帶Shannon多樣性指數的計算 ,在現在看來,根本不值一提,但是在當時自我感覺還是不錯的,相當有成就感了。后來在課程(數值分析,微分方程數值解)中matlab經常用到,另外在幫師姐做管理方面的數學模型時用的比較多,便自學了相關方面的知識,主要是看書,自己編程還有上網交流,這時在百度上回答了很多matlab相關的問題,并成為百度matlab技術論壇的副團長,在emuch中蒙前計算模擬區區長cenwanglai看重,聘為計算模擬版的版主。Matlab涉及的方面非常廣,下面我就自己的理解談下matlab一些特點和我學習matlab的一點體會,希望能對大家有點幫助,有什么不對的地方,敬請指正!
2.matlab的一些特點
A.Matlab是一個基于矩陣運算的軟件,這恐怕是眾所周知的事情了,但是,真正在運用的時候(就是在編程的時候),許多人(特別是初學者)往往沒有注意到這個問題,因此,for循環(包括while循環)嵌套了十幾層,這不僅是暴殄天物(沒有發揮matlab所長),還浪費了你寶貴的時間,就只見左下角一直busy。
B.友好的界面,易于操作 ,雖然matlab一打開總看到命令行窗口,其實matlab有很多的GUI工具箱,可以很方便實現很多功能,對于一些不喜歡寫代碼的人來說,使用起來非常方便。舉些例子曲線擬合工具箱cftool,曲面擬合工具箱sftool ,遺傳算法工具箱gatool等等
C.matlab繪圖功能,matlab可以非常方便的繪制二維,三維,四維,矢量圖形。
例如:
plot: x軸和y軸均為線性刻度(Linear scale)
loglog: x軸和y軸均為對數刻度(Logarithmic scale)
semilogx: x軸為對數刻度,y軸為線性刻度
semilogy: x軸為線性刻度,y軸為對數刻度
bar 長條圖
errorbar 圖形加上誤差范圍
fplot 較精確的函數圖形
polar 極座標圖
hist 累計圖
rose 極座標累計圖
stairs 階梯圖
stem 針狀圖
fill 實心圖
feather 羽毛圖
compass 羅盤圖
quiver 向量場圖
下面給幾個matlab繪出一些特殊圖形看看matlab繪圖的效果
D.豐富的庫函數(而且比較好用),這個看自己專業相關工具箱,涉及太廣無法一一介紹。
3. 學習matlab心得體會
我覺以下幾點對于學好matlab很重要:興趣、悟性、勤奮、堅持。
興趣,不知道哪位名人說過“興趣是最好的老師。”我覺得非常有道理,我曾對于matlab制作動畫很感興趣,并收集了很多例子,在小木蟲貼出來后很多人對于matlab制作動畫都很感興趣,計算模擬版活動---程序模擬動畫展示 ,一個人一旦對某事物有了濃厚的興趣,就會主動去求知、去探索、去實踐,并在求知、探索、實踐中產生愉快的情緒和體驗。這樣才能主動學習,并且學好到精通。
悟性,通常人認為指頓悟,慧根,我覺得就是對一個問題不斷的思索,將自己的體會和感受融合,獲得屬于自己的知識。有很多事情、問題,都是可以想明白的。只有不停的想,才能想明白,想透徹。就像我自己解決matlab編程進行DGGE電泳圖譜多樣性相似性分析,當時沒有工具,而且問題必須解決,于是我不停的想,吃飯時,睡覺前,最終終于解決。
勤奮,一勤天下無難事。從古到今,有多少名人不是有勤奮而得來成功的。現在的年輕人,一代比一代聰明。要不被別人淘汰,要超越別人,只有靠時間堆出來。每天多學一些,多積累一些。學習matlab也一樣,想要學會,使用熟練,不花時間練習,寫代碼,親自運行調試,是很難掌握好的。
堅持,認準了的事情,就堅持做到底,直到有所收獲。事實上,很多人實現不了自己的目標,很大程度上就是少了一種堅持、非要把事情干到底的精神,他們往往淺嘗輒止,因此眼睜睜失去了可能到手的成功。光有興趣,只有三分鐘的熱情是很難成事的。很多事情的成功取決于踏平坎坷地堅持的毅力。看準了的事情,如果沒有百折不撓的堅持,絕難取得成功。看準的事情就不屈不撓地堅持干下去直至成功,才是智者的唯一選擇。每一個人都明白所有夢想的實現都需要努力,然而,很多人只所以沒有實現心中的夢想,就在于多了空想、猶豫,少了努力堅持。
至于具體方法:
1.多動手寫程序、調試
這里有些常見錯誤提示信息供大家參考
1.Subscript indices must either be real positive integers orlogicals
中文解釋:下標索引必須是正整數類型或者邏輯類型
出錯原因:在訪問矩陣(包括向量、二維矩陣、多維數組,下同)的過程中,下標索引要么從 0 開始,要么出現了負數。注:matlab的語法規定矩陣的索引從 1 開始,這與 C 等編程語言的習慣不一樣。
解決辦法:自己調試一下程序,把下標為 0 或者負數的地方修正。
2.Undefined function or variable "a"
中文解釋:函數或變量 a 沒有定義
3.Input argument "x" is undefined
中文解釋:輸入變量 x 沒有定義
4.Matrix dimensions must agree
Inner matrix dimensions must agree
中文解釋:矩陣的維數必須一致
出錯原因:這是由于運算符(= + - / * 等)兩邊的運算對象維數不匹配造成的,典型的出錯原因是錯用了矩陣運算符。matlab通過“.”來區分矩陣運算和元素運算
5.Function definitions are not permitted at the prompt or inscripts
中文解釋:不能在命令窗口或者腳本文件中定義函數
出錯原因:一旦在命令窗口寫 function c = myPlus(a,b),此錯誤就會出現,因為函數只能定義在 m 文件中
6. 1) X must have one or two columns
2)Vectors must be the samelengths
中文解釋:
1. X 必須是 1 或者 2 列
2. 向量長度必須一致
7.One or more output arguments not assigned during call to'...'
中文解釋:在調用...函數過程中,一個或多個輸出變量沒有被賦值
8.??? Error using ==> mpower
Matrix must be square
中文解釋:錯誤使用mpwoer函數,要求矩陣必須是方陣
9.Explicit integral could not be found.
中文解釋:顯式解沒有找到
10.Index exceeds matrix dimensions.
Attempted to access b(3,2); index out of bounds becausesize(b)=[2,2].
中文解釋:索引超出矩陣的范圍
11.In an assignment A(I) =B, the number of elements in B and I must be the same
中文解釋:在賦值語句 A(I) = B 中,B 和 I 的元素個數必須相同
12.To RESHAPE the number of elements must not change
中文解釋:矩陣變換時,變換前和變換后的總元素不能改變
2.善于利用MATLAB的幫助
一遇到什么問題,通常我的第一反應是:help,就先說說自己對help的一些常用方法吧。
1)命令窗口直接敲“help”,你就可以得到本地機器上matlab的基本的幫助信息。
2)對于某些不是很明確的命令,只知道大體所屬范圍,譬如說某個工具箱,直接在命令窗口中敲入
Help toolboxname,一幫可以得到本工具箱有關的信息:版本號,函數名等。
3)知道函數名,直接用help funname就可以得到相應的幫助信息。
3.善于向別人學習,多看牛人寫的代碼并消化
三人行,必有我師,一個人很難什么都精通,取長補短是最快的進步方法。Matlab的File exchange和pudn上都用很多代碼,多看看牛人寫的代碼,了解他們編程技巧和思想,并消化,對于提高自己的編程水平非常有利。
4.時間積累
“冰凍三尺非一日之寒”,學習需要日積月累,多積累一些matlab的技巧,對于編程是很有利的,比如求序列中的極值,下面一些正是小代碼體現大智慧的典范!
利用數學里駐點和極值點定義來求。
CODE:
>> aa=randperm(20)??
aa =??
16 13 17 7 19 18 14 8 11 2 20 3 6 4 15 1 12 10 5 9??
>> bb=intersect(find(diff(aa)>0)+1,find(diff(aa)<0))??
bb =??
? ? 3 5 9 11 13 15 17??
---------------------------------------------------------------------------------------------------------------------
----------------------------------hyperelastic 的方法----------------------------------------------------------??
N = 100;??
aa=randperm(N);??
index = find(((aa(2:N-1)>aa(1:N-2))+(aa(2:N-1)>aa(3:N)))==2)+1;??
bb = aa(index);??
-------------------bainhome??的方法-----------------------------------------------------------------------------
a=rand(1,100);? ?find(diff(sign(diff(a)))>0)+1
---------------------------------------------------------------------------------------------------------------------
以上代碼都是求極大值,略微變換后可以得到極小值。出自:中華鋼結構論壇
------------------------------------eight版主給的方法------------------------------------------------------------
d=diff(x);
n=length(d);
d1=d(1:n-1);
d2=d(2:n);
indmin=find(d1.*d2<0 & d1<0)+1;
indmax=find(d1.*d2<0 & d1>0)+1;
---------------------------------------------------------------------------------------------------------------------
雖然基本原理一樣,不過方法都各有特色。都是前輩們智慧的結晶。
4.matlab的一些資源
1) ?http://www.mathworks.com?mathworks的官方網站
2) http://www.matlabsky.com/forum.php?matlab技術論壇
3)?http://www.ilovematlab.cn/forum.php?matlb中文論壇
4)?http://www.mathworks.cn/matlabcentral/fileexchange 可以下載一些matlab代碼
本文轉載自小木蟲作者dbb627,鏈接:http://muchong.com/t-4340045-1。
材料牛石小梅編輯整理。
文章評論(0)