首頁 > 其他

matlab初級教學,如何學會matlab軟體?

2019-12-25 08:04:42

對於大多數剛接觸matlab軟體的學員來說,我相信你們和我當初一樣,走過很多彎路,買過許多書籍,在網上通宵下載過好幾十G的資料或者視訊,結果還是一頭霧水。我從事matlab軟體分析接近6年了,在此給你們說一下matlab的學習方法和思路,希望你們不要走以往的彎路,有希望我的建議對你們有所幫助。


1

如何選擇學習資料?

   由於matlab是一款功能強大的軟體,涉及的領域很廣,學習難道較大,目前市場上matlab的教學權威的並不多,個人推薦使用《10天學會matlab教學》,以我的經驗個人覺得這套教學對學習matlab幫助是很大的,我們除了能對軟體有一個操作有很詳細的了解,還詳細的講解了理論知識的視訊,我剛接觸到這套教學的時候,給了我很多幫助。我推薦這套教學給大家的主要原因不主要是因為教學講解的詳細,而是使用matlab處理具體的問題時,我們經常會遇到大量ERROR提示,但我們卻不能時刻的去問老師,而購買這套教學後我們可以隨時與趙老師溝通尋求幫助,這是很可貴的。 但想要精通matlab其實並不是一件容易的事情,我們不得不從理論開始,在結合軟體的操作和幫助文件去幫助我們快速入門,有好的教學也需要我們有耐心去學習,我身邊有無數學習ANSYS的同事,但最終能完全學好的沒有幾個,所以找到正確的方法,堅持學習很重要。


2

我接觸Matlab的時間比較長了,最開始是在大學裡面的數學實驗課上了解了一些,學了些基礎的命令,後來參加過一次數學建模,又自學了點。而後由於所學的專業是生命科學和環境相關的東西,用到matlab的機會不多,主要是一些功能用matlab實現起來不是很方便,而且手邊有現成的軟體可以做到,例如影象分析,還有DNA序列分析都有現成軟體等。本以為不會與其有太多交集。我下決心學習matlab是在經歷幾件事情之後。當時,在做碩士論文時需要對電泳圖片做微生物種群的多樣性分析和相似性分析,當時手頭的軟體只能將電泳圖轉化為各個泳道的灰度和位置方面的資料,而不能對資料進行分析,而能進行這樣分析的軟體(Bionumerics)比較貴,只為了這個用幾次而買顯然很不划算。無奈之下,我查了些文獻,了解計算的原理後便用比較熟悉的matlab程式設計解決這個問題,其實這個程式比較簡單--DGGE中條帶Shannon多樣性指數的計算 ,在現在看來,根本不值一提,但是在當時自我感覺還是不錯的,相當有成就感了。後來在課程(數值分析,微分方程數值解)中matlab經常用到,另外在幫師姐做管理方面的數學模型時用的比較多,便自學了相關方面的知識,主要是看書,自己程式設計還有上網交流,這時在百度上回答了很多matlab相關的問題,並成為百度matlab技術論壇的副團長,在emuch中蒙前計算模擬區區長cenwanglai看重,聘為計算模擬版的版主。Matlab涉及的方面非常廣,下面我就自己的理解談下matlab一些特點和我學習matlab的一點體會,希望能對大家有點幫助,有什麼不對的地方,敬請指正!


3

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繪圖的效果



4

D.豐富的庫函數(而且比較好用),這個看自己專業相關工具箱,涉及太廣無法一一介紹。


5

學習matlab心得體會:

我覺以下幾點對於學好matlab很重要:興趣、悟性、勤奮、堅持。 興趣,不知道哪位名人說過「興趣是最好的老師。」我覺得非常有道理,我曾對於matlab製作動畫很感興趣,並收集了很多例子,在小木蟲貼出來後很多人對於matlab製作動畫都很感興趣,計算模擬版活動---程式模擬動畫展示 ,一個人一旦對某事物有了濃厚的興趣,就會主動去求知、去探索、去實踐,並在求知、探索、實踐中產生愉快的情緒和體驗。這樣才能主動學習,並且學好到精通。 悟性,通常人認為指頓悟,慧根,我覺得就是對一個問題不斷的思索,將自己的體會和感受融合,獲得屬於自己的知識。有很多事情、問題,都是可以想明白的。只有不停的想,才能想明白,想透徹。就像我自己解決matlab程式設計進行DGGE電泳圖譜多樣性相似性分析,當時沒有工具,而且問題必須解決,於是我不停的想,吃飯時,睡覺前,最終終於解決。 勤奮,一勤天下無難事。從古到今,有多少名人不是有勤奮而得來成功的。現在的年輕人,一代比一代聰明。要不被別人淘汰,要超越別人,只有靠時間堆出來。每天多學一些,多積累一些。學習matlab也一樣,想要學會,使用熟練,不花時間練習,寫程式碼,親自執行偵錯,是很難掌握好的。 堅持,認準了的事情,就堅持做到底,直到有所收穫。事實上,很多人實現不了自己的目標,很大程度上就是少了一種堅持、非要把事情幹到底的精神,他們往往淺嘗輒止,因此眼睜睜失去了可能到手的成功。光有興趣,只有三分鐘的熱情是很難成事的。很多事情的成功取決於踏平坎坷地堅持的毅力。看準了的事情,如果沒有百折不撓的堅持,絕難取得成功。看準的事情就不屈不撓地堅持乾下去直至成功,才是智者的唯一選擇。每一個人都明白所有夢想的實現都需要努力,然而,很多人只所以沒有實現心中的夢想,就在於多了空想、猶豫,少了努力堅持。


6

至於具體方法: 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的技巧,對於程式設計是很有利的,比如求序列中的極值,下面一些正是小程式碼體現大智慧的典範!


7

利用數學裡駐點和極值點定義來求。CODE:??[Copy to clipboard]--------------------------------------ilxy的方法------------------------------------------------------------------- >> 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 1
3 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; ------------------------------------------------------------------------------------------------------------------------ 雖然基本原理一樣,不過方法都各有特色。都是前輩們智慧的結晶。
------------------------ ----------------------------------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; ------------------------------------------------------------------------------------------------------------------------ 雖然基本原理一樣,不過方法都各有特色。都是前輩們智慧的結晶。

IT145.com E-mail:sddin#qq.com