如何學好 MATLAB?
------寫在所有之前-----【v 1.2】
推薦一個網站,About - Project Euler是一個編程數學網站,把上面的題用matlab來一遍matlab就學得差不多了
-----------------------------------------------------------------------------------
今天閑,扯一扯我是如何入門MATLAB的
【哇 離第一次編輯這個答案已經過去兩年多了,how time flies】
----------------------------------------正題--------------------------------------
開始:&<準備工作&>MATLAB里的所有運算都是以矩陣為基礎的,所以想學好MATLAB,線性代數是必須的,也不用學的太深稍有了解就好,畢竟最重要的還是編程思想
然後就是入門了:選一本自習喜歡而且適合入門的書
個人覺得這本書比較適合入門
最重要的三條
- 看help
- 看help
- 看help
值得一提的是MATLAB的自帶程序包,大大提高生產力
這是幾十萬mathworks精英碼農被逼加班熬夜優化再優化的東西,利用起來會發現生活很美好
熟悉了基礎操作之後可以開始嘗試一些更深入一點的內容,比如圖像操作,視頻操作,去實現一些更加複雜酷炫的內容,這個時候也可以開始著手去寫一些自己的GUI
對,MATLAB也可以寫GUI,而且是在強大的矩陣運算做後盾的情況下,GUI實現相同功能的代碼量和效率都是非科學計算語言不能比的
這個是我先來無事寫的誤差分析的GUI第一次寫,十分笨拙,連查help帶碼代碼花了一下午
最後回到本提問,如何學好MATLAB。。。多練,多碼,對,就是我開頭給的那個http://projecteuler.org
用MATLAB做幾十題就差不多可以熟練應對普通量級的計算任務啦
---------------------------------------------------------------
對了Pjer
這個裡面有些資源,我收藏的,喜歡就拿去咯
version 1.1 新增部分
【--2015年6月1日22:15:58--】
關於計算效率,現行的大部分計算機數學題大多數都會有一個特點,可以用很直觀很好想的辦法但是要消耗很大計算資源(暴力流),還有就是可以用很巧妙的方法迴避大宗量的計算和儲存任務(智商流),其中智商流對數學功底要求比較深厚(天生數學水平捉急)
而這裡的計算效率指的是包含計算程序(或計算命令)開發在內的時間成本。也是有感於我剛剛回答的另外一個題10個數字做加法,數字不能重複,該怎麼做? - 演算法
問題不在贅述,我剛看到這個問題的時候,第一反應是大致估計計算成本上限,就是用完全暴力的方法枚舉加篩選所要計算次數的數量級,發現完全低於10^6也就是GHz核心的電腦不足千分之一秒可以給出結果於是這時出現了相當一批碼農兄弟上c++,python 程序我看了,的的確確做了優化使時間複雜度壓縮到有藝術感【*_*】,看到這些幾十行甚至上百行的代碼我默默打開MATLAB,兩個命令給出了相同的答案Pjer 的回答,整個過程五分鐘左右
記得在MATLAB小論壇里曾經看到過一個(好像是)叫,【一行計算----科學計算之美】的文章剛去找沒找到大致是說那些可以在一行里完成的計算稍複雜的計算或者可視化。當然是用matlab,mathematica中的完成,因為這兩個語言的底函數實在是太豐富了,涵蓋了異常矩陣和人工智慧演算法和底函數。
人類歷史從使用工具開始
所以:
如果不是為了鍛煉c++或python吧啦吧啦語法和演算法複雜度優化能力,單單把任務任務來完成的話
--------------------------------------------------------------
講講關於優化計算
(生產更高效的代碼)
都不知都遇到過多少次吐槽matlab慢的,無語。先貼一個benchmark這個是julia官網的比較常用的幾個模塊的測試
matlab僅僅在parseint的過程中顯得很弱因為它數據轉換的形式的複雜性,從文本到數的轉換慢是可以理解的,在其他幾個計算的硬菜上matlab表現還都是非常出色的,甚至有超過fortran的,matlab對矢量化支持非常好,對於矢量元素操作是自動並行的,所以能用向量表示的就用向量表示,親眼見過搞圖像處理的matlab小白為了把兩段視頻疊加起來開了四層嵌套大循環跑了幾個小時然後大罵matlab慢的跟翔一樣。
matlab是解釋型的,相當於是編譯依據執行一句,所以循環是最坑的執行幾遍要編譯幾遍,當然現在也有優化,但是為了保證語言特性的靈活,沒有變成編譯語言。
所以寫程序之前默念一句話【矢量化大法好】,這是最基礎的。沒有矢量化那簡直就是c的語言特性加python的速度
對於一個程序要找出關鍵節點進行重點優化,比如說一個程序里的某種矩陣操作,大部分運算都能用到,那麼這個就是關鍵節點,要重點優化。
matlab提供了一個叫做profile的函數,可以記錄程序在各個模塊消耗的時間統計出來給優化提供參考(如圖)
然後是優化的一個大殺器是並行
軟體本身是有個parallel computing toolbox 最簡單的並行parfor就是for循環如果前後耦合性不強的話可以通過分配給多個worker來實現概念上的並行,提高效率
其實最有效的(對於大矩陣的運算)還是GPU運算,(首先你得有個n卡(當前matlab只支持NVIDIA的顯卡加速)),因為GPU的流處理器個數遠多於CPU核心數,所以並行如果可以放到顯卡里對運算的優化使顯而易見的
下圖是一個benchmark可見GPU在加速計算方面的效果是極其顯著的
而對於gpu優化計算,水就更深了
可以幾行代碼就實現簡單的優化
也可以深度優化
一個栗子:
算分型的栗子:
% Setup
t = tic();
x = linspace( xlim(1), xlim(2), gridSize );
y = linspace( ylim(1), ylim(2), gridSize );
[xGrid,yGrid] = meshgrid( x, y );
z0 = xGrid + 1i*yGrid;
count = ones( size(z0) );
% Calculate
z = z0;
for n = 0:maxIterations
z = z.*z + z0;
inside = abs( z )&<=2;
count = count + inside;
end
count = log( count );
% Show
cpuTime = toc( t );
用cpu要算5.8s
如果做一些微小的修改:
count = ones( size(z0), "gpuArray" );
就多了一句話 24倍優化,解釋一下,這個在聲明變數的時候加一個gpuarray就相當於是吧變數從host memory轉成gpu memory然後後面的計算都是GPU資辭的。所以大部分計算都是GPU內計算當然是比西方記者還快。
如果覺得這還不夠的可以用arrayfun加速:
count = arrayfun( @pctdemo_processMandelbrotElement, ...
xGrid, yGrid, maxIterations );
原理上就是host並行加gpu並行
matlab支持cuda就當然會支持寫device碼編譯進GPU作為一個模塊調用(太麻煩但是效果極其顯著)
__device__
unsigned int doIterations( double const realPart0,
double const imagPart0,
unsigned int const maxIters ) {
// Initialize: z = z0
double realPart = realPart0;
double imagPart = imagPart0;
unsigned int count = 0;
// Loop until escape
while ( ( count &<= maxIters )
((realPart*realPart + imagPart*imagPart) &<= 4.0) ) {
++count;
// Update: z = z*z + z0;
double const oldRealPart = realPart;
realPart = realPart*realPart - imagPart*imagPart + realPart0;
imagPart = 2.0*oldRealPart*imagPart + imagPart0;
}
return count;
}
device碼是c在cuda的規範下寫的
540倍啊 啊啊啊 啊啊啊啊 是吧,別再說matlab慢了,會用就快了
如果遇到了問題 find me on WeChat
微信id:pjer1234567
依然看心情更
MATLAB編程的精髓在我看來就是:矩陣化和向量化。將其他語言中需要用循環才能實現的功能使用矩陣運算來實現。比如將一個數組arr進行N次的延拓:
arr = [1 2 3 4 5]";
tmp = arr * ones(1, N);arr = tmp(:)
在上面的代碼中,使用了列向量和行向量的乘積tmp實現了數據的N次複製,最終利用MATLAB矩陣的列優先存儲的性質,將矩陣tmp拉伸成向量。
矩陣化的另一個體現就是邏輯矩陣的應用,假設a是一個標量,那麼a &> 3這類表達式的值為1或0。MATLAB有意思的一個性質是,當A時一個矩陣時,A &> 3將返回一個充滿0和1的矩陣,這個矩陣的每個元素值取決於它們與3這個常數比較大小的結果。利用這個性質,我們能夠實現將矩陣A中所有非負元素求和的功能:A = randn(5, 5);
val = sum(sum(A(A &> 0)));
A與邏輯矩陣進行元素間相乘後,得到的矩陣僅在非零元素處保持不變,其他位置都被設為0。此時將矩陣每個元素相加,就是A中所有非負元素的和。
以上只是簡單的例子,學好MATLAB最重要的是實踐。研一上課,老師讓做模擬作業,要求用matlab,然而不怎麼會,尤其仿的東西還比較麻煩,當時看來。
感覺是「卧槽,TM好難,我學不會啊,馬上就要交作業了,腫么辦T_T」研二回了所,頭兩個月上手幹活,就是要重新做之前的作業,來打基礎。硬著頭皮上手,發現matlab也就這麼回事,現在的感想是這玩意好強大,看到自己想做啥,第一反應看看matlab能不能完成。最後,給想入門的幾個建議吧。1.找一個項目去做,不要按部就班的看書。那樣太慢。2.雖然不按部就班的看書,但是手邊還是要有幾本書的,一本函數速查手冊,一本基礎教程,一本高級教程。基本需要運用就足夠了。3.練好英語,不會的多去看幫助文檔。4.如果深入到需要用到某些特定工具箱,相應的資料,一般都能找到。兩天前,很榮幸在問題中的回答「Matlab能幹嘛?--打浦橋程序員的回答」獲得了不少朋友的認同。
對於如何學好Matlab這個問題,我認為,學習編程一定要帶著需求去學,一定要清楚自己想實現什麼功能,而盲目的去讀工具書,是一個很不切實際並且很容易喪失學習積極性的一種方法。如果一些朋友想學習Matlab但是暫時還沒有很具體的需求,不介意的話,可以用我上述問題「Matlab能幹嘛?--打浦橋程序員的回答」中答案的例子來練習。
早些時候,我曾經在我的公眾號上發過一篇帖子「如何自學Matlab」,就我個人學習經歷而言,學習Matlab大致分為三個階段:
1. 數據分析
2. 文本處理
3. 專業應用
其中每個階段需要關注的知識點,我在這篇帖子中,都稍有描述。
除了基本知識點的積累之外,我覺得最重要的莫過於解決問題方法,畢竟不是每個問題的答案都能在網上找到,或許,你是第一個碰到這個問題的人。
問題大致分為兩類問題,一種是比較常見的問題,而另一種是比較罕見的問題。
對於比較常見的問題,相信大家在Matlab入門之後,解決問題的方式基本差不多。早在今年4月份的時候,我在公眾號發過一篇帖子"掌握四點就能學好任何編程語言",其中我以舉例的方式,介紹了在解決問題過程中的四個步驟:
1. 網路搜索你的問題以及你的需求
2. 參考現有的例子
3. Debug調試
4. 請教別人
雖然這篇帖子是針對Excel中的VB而寫的,但是我覺得從解決問題的角度來看,大致是相同的。
而對於另一種比較罕見的問題,也就是說,網上基本上搜不到,問別人也沒人懂。那怎麼辦?這時候就需要自己去探尋答案了。上周五,我在公眾號寫了一篇帖子"Matlab如何生成Word文檔",是關於Matlab自動生成Word文檔的,其中舉例說明了,如何自己去確定單元格背景顏色的設定參數。具體的過程我就不在這裡重複介紹了。不過我一直所秉持的觀點是:授人以魚不如授人以漁。比起給人代碼,不如教別人如何去看清問題本質,如何自己去尋求答案。
所以,對於如何學好Matlab這個問題,總的說來,就是三個步驟:
1. 了解最最基礎的知識點
2. 並且掌握如何去解決比較常見的問題
3. 以及在遇見罕見問題時能夠自我追尋答案
以上
如果你有興趣,歡迎關注我的微信公眾號「打浦橋程序員」,謝謝
除了一般的學習編程語言的方法外(比如多動手編程,多閱讀優秀的代碼),還需要學好線性代數,畢竟MATLAB以矩陣運算見長。
Matlab的學習主要分三步:
第一步,了解基本語法。如果你有其它編程語言基礎,只需隨便找一本Matlab教材,在圖書館看一下午就夠了。命令太多怎麼辦?放心,除了一些基礎的東西以外,大多數內容很快就會被忘記的。你不需要現在就記住所有命令,要用的時候去查就好了。
第二步,增加知識的廣度。在這個階段主要是見多識廣:原來還有這個命令可以這麼用啊。你可以上MATLAB中文論壇和MATLAB技術論壇,還有就是每天學習一個小技能。見多識廣的好處就是在以後想完成某些操作的時候,至少能知道有哪個命令可能會有用。迷路時,最難的不是努力走,而是不知道往哪裡走。
第三步,增加知識的深度。在這個階段你可以做一些具體的項目,通過具體項目來學習是最好的方式。比如,如果你以後想做圖像處理,可以試著解決如何打開一張圖片,如何用矩陣處理圖像,如何做圖像插值放大,如何銳化圖像。
如果對Matlab使用中的經驗、教訓或者好玩的東西感興趣,可以關注我的微信公眾號「科學計算編點程(微信號:kexuebc)」。用卡通連載的形式,每天推送一條Matlab實用小技巧,例如:學習Matlab的三個境界歡迎關注「help」 urself and try to run all things in matrix
語法得懂啊,但是matlab的語法太簡單了……
使用help,關注你所在領域的tools,裡面的函數多的去了,基本上成熟的演算法都有……能寫出來小程序以後就可以考慮別的方面了,例如執行機制等,有助於提升程序的效率……逛論壇,matlab論壇有好多吧,我記得有一個是http://wiki.ilovematlab.cn……接下來可以考慮學習GUI、Simulink,什麼S函數之類的(反正不用我是不會去看),還有就是與別的語言的介面(個人感覺沒大用處,matlab還是以模擬為主吧)……還不滿足的話,研究函數,開發函數吧……最重要的,多練……………………………………需要說明的是matlab中有一些函數是不成熟的,這些函數能看到代碼,可以更改,但是在某些方面絕對有缺陷,所以你編寫出來的程序如果有問題的話(你感覺沒問題),可以看看是不是用了不恰當的函數……good luck~以我學習過的經驗給樓主個建議:先看 MATLAB揭秘,具有國外經典教材具有的共同特色,上手超快。有中文翻譯版,鄭碧波女士 義務翻譯的,我很敬佩、感激她!接下來可以看 北航出版的 精通matlab2011a ,這本在國內算經典的了,可以再次系統的學習一下接下來就看你的研究領域了,看一些專業的
英語要過關,至少能看懂help
首先,我也只是初學者,一共用Matlab編的程序應該也不超過一萬行,但是我覺得自己也應該貢獻一點個人經驗。半年前因為做research需要Matlab作為圖像處理工具,開始自學,也有老師的幫助和指導,第一件事就是讓我讀教程,讀了兩周的課本,讀得枯燥乏味,最後什麼也記不住。老師也建議我直接讀那些實例章節。但是一旦接手了具體工作,開始工作後,開始有動力學習了,遇到不會的,就去google,Matlab自帶的lib就能解決80%的問題,再不會的可以上網搜索,你都不知道有多少類似的問題別人已經問過了。當然你必須要篩選答案,很多答案並不是正確的或者適合你的,也可以結合讀書,書從最基本的給你講解幫助你理解問題的本質以及解決問題的思路和邏輯。再不會就去問高手了總之,我認為理解最基本的線性代數,矩陣等知識,看幾個Matlab最基礎的教程就可以開始使用了,邊用邊學。如果像我一樣想一開始就弄懂所有的功能那就本末倒置了,工具永遠只是工具,永遠不要把學習使用工具當作目的。
看看TLD tracking 好幾千行代碼沒有一個循環,matlab本身不難,本來就是給非計算機人用的
just code it
Matlab 已經足夠簡單,所以不需要想太多,看了一些基本的示例,直接去做就行了。matlab不是用來學的,認清楚這個很重要。可以用matlab寫gui,寫類,寫simulink,然而並沒有什麼用。知道什麼是svd么,了解svm,pca,assimilation, iterative estimation么,會區分各種小波么,mmse,ls,去噪演算法呢,有限元呢matlab從來就不是用來編程的(不要說它的編譯工具,真心用不上),是設計與驗證演算法,模型,和理論的。至於寫代碼,還是交給軟體工程師好了。
多讀書~~~推薦幾本MATLAB:《精通MATLAB》、《MATLAB R2014a從入門到精通》、《MATLAB R2014a完全自學一本通》、《MATLAB寶典》機器學習:《數據挖掘實用機器學習工具與技術》、《數據挖掘導論》、《機器學習》、,《數據挖掘與機器學習WAKA應用技術與實踐》Python:《利用Python進行數據分析》、《Python基礎教程》、《Python Cookbook》、《「笨辦法」學Python》資料庫:《MongoDB權威指南》、《資料庫系統概念》、《SQL語言與資料庫操作技術大全》、《Oracle從入門到精通》R語言:《統計建模與R軟體》、《R語言實戰》、《ggplot2數據分析與圖形藝術》、《數據挖掘與R語言》
前面的大牛都回答的很好。我只簡單補充兩點。
第一,MATLAB十分龐大,即便是MATLAB大牛,可能也會出現隔行如隔山的情況。由此大牛說的方法和途徑,極有可能不適合自己。比如一個搞電力電子的模擬大牛,可能對圖像處理一竅不通;同樣,圖像處理一竅不通的大牛,也極有可能對偏微分方程一竅不通;第二,對於基礎不同(包括三大基礎數學層次,編程能力,工程專業知識),目標不同的學習者,學好MATLAB的方法也千奇百怪,也可能很難找到適合的方法。比如,我是因為數學建模想學好matlab;我是因為項目課題需要學好matlab;我是真愛matlab;我就那麼一說。
所以,兩個問題的關鍵之處,就是在於對自我的判斷和對方法的判斷。換句話說,就是
給自己分級,給領域分類
。由此,我分了一個級:
初學零級:順手一收集,百度文庫什麼的。
初學一級:隨便一本MATLAB書籍初學二級:找兩個題目自己變成或模擬初學三級:可以泛讀help文件中學一級:以項目為主線,不斷查閱各種文庫和書籍中學二級:以項目為主線,不斷查閱各種中文論壇中學三級:以項目為主線,不斷查閱help文件大學一級:以主題為目標,圍繞一個主題系統學習某一領域大學二級:以主題為目標,圍繞兩個主題系統學習某兩個領域大學三級:可以對主題進行分類了,掌握基礎help,熟悉某些領域help大學四級:對某些專業領域MATLAB著作能夠融會貫通,熟悉matlab英文論壇研學一級:能夠圍繞某個細節主導項目研學二級:主導項目的某細節能夠達到國際先列研學三級:。。。 。。。當然,這個分級不是很規範,但是還是比較能夠看到對自我的分級和對領域的分類。這裡我也就不贅述自己的領域了,可能反而把初學者帶偏了。最後的一個建議,看help文檔吧,總有一款適合你。之前看到一個問題很像,引用一下如何學好MATLAB?
從個人使用經驗上來看,MATLAB的學習可以類比C語言的學習。因為本人就是在本科時先學的C之後學的MATLAB,覺得兩者及其類似。
由於MATLAB的參考書比較多,可以從網上或者書店中找一本自己喜歡的或者讀的下去的開始學習。MATLAB的基本語句、函數、函數的編寫等等就那些基本知識,都學會了之後就在於你自己對於它的後續開發的使用了。可根據你不同的要求和使用習慣再選擇細化知識,也就是說打好地基之後,後面的學習就可以現學現用了。比如你需要用它進行數值計算,專門學習數值計算知識,在使用時用到就好了。還有一些其他的模塊比如模擬等,除非是天天使用,平時只要知道個大概,需要的時候查找一下即可。
對於MATLAB的編程還是建議多多練習,嘗試著自己提出問題自己解決,或者編寫一些自己喜歡的內容。這裡可結合著自己的興趣順便學習提高MATLAB。比如MATLAB可以對圖像進行處理,你就可以找一些網上的素材和參考資料進行練習,這對你平時也是有用的。還有一些個演算法,像K-means、遺傳演算法之類的,不要照抄代碼,要自己想好了,列一個框架圖,然後自己編寫,找錯誤,並對演算法進行優化。
總之,MATLAB入門很容易,想要學好就需要不斷練習,不斷思考。多進行練習和糾錯,相信你可以很快提高的。
先學下線性代數前幾章。知道什麼是矩陣,什麼是數組。它們是如何運算的。它們的元素索引是怎麼定義的。循環。簡單的邏輯判斷。再有問題可以看看help。再有問題,可以來找我^_^
把以前寫過的代碼用matlab再實現一遍
MATLAB不論在學習還是工作中都有著重要的作用,我自己使用MATLAB到現在也有10年了,從大學到研究生在到工作,關於MATLAB的基礎部分的學習還是比較簡單的,如果有過C語言或者其他語言的編程基礎,學MATLAB是非常簡單的,如果原來沒有接觸過其他的編程語言,也不要緊,相比較其他語言,MATLAB的語法算是簡單的了。但是MATLAB的應喲領域是非常廣泛的,只有基礎才是第一步,如果以後想要從事圖像處理方向,學完MATLAB之後還需要學圖像處理方面的演算法,如果想做數據分析,還需要學習MATLAB數據分析這方面的知識,我的研究方向就是圖像處理,數據分析自己也研究過,對這塊比較熟悉,關於圖像處理,MATLAB實現圖像處理的演算法卻是比c++要容易些,同樣一個演算法用C++可以要上百行,MATLAB可能就一個函數就搞定了,因為MATLAB把一些演算法都給封裝好了,直接調用就可以了,所以學習MATLAB比學習其他語言是要簡單的。關於如果學習MATLAB,首先把MATLAB基礎知識過一遍,可以找一本MATLAB的書籍,或者也可以去網易雲課堂或者騰訊課堂找到的講的一門MATLAB課程《MATLAB基礎知識大串講》,MATLAB基礎看過之後,多MATLAB就有了一個大致的理解,然後你就可以進入你自己的特定領域了,不論是圖像處理,數據分析等等。關於MATLAB的更多學習問題大家可以留言討論,也可以加我Q
1669199947 一起討論學習。
推薦閱讀:
※媒體稱中國科研經費超過五千億但成果寥寥,原因何在?
※「速食麵的營養比包子更均衡」是真的嗎?
※機器學習是否轉變了傳統科研的思路?人們不再需要定義清楚問題,而是依靠機器學習猜測問題?
※如果人類的壽命大大延長,這對科學發展是好是壞?
※2018 年,你的研究領域有哪些新趨勢,又會面臨哪些新挑戰?