在MATLAB入門之後,平時應該怎麼練習,才能了解,掌握更多更加方便的函數,編程技巧?
在MATLAB入門之後(掌握基本函數使用,應用MATLAB做過幾個小作業),但水平停滯不前。平時應該怎麼練習,才能發現,了解以及掌握更多更加方便的函數,編程技巧?
自己對Matlab的應用現階段其實很窄,幾乎就是在把MATLAB當個傻瓜版FORTRAN用來做作業而已,所以只能說一下在數值計算方面的體會。
我覺得讓自己主動去了解更多進階函數和技巧的動力主要是在向量化編程和sparse matrix上。由於Matlab的for循環慢成狗,所以每次code能跑起來之後就總是琢磨著如何把程序里for循環都砍掉,而用sparse matrix的話也沒有辦法簡單愉快地直接m行n列這樣來assign matrix entry了。這種時候就自然而然地用試著n維矩陣or cell來存取數據,或者用一些比較進階的build-in function啦。
舉個例子,最近做了一個multigrid的作業,涉及到了一個往數組裡面多次存入數據的問題,但是我又希望多次存入的數據能在重合的位置累加而不是覆蓋。之前的代碼偷懶,就用了兩層for循環來實現。for n = 1:N
index = EToV(n,:);
[delta,abc]=basfun(n,VX,VY,EToV);
q_mean = delta*mean(qt(index))/3;
for r = 1:3
q(r,n) = q_mean;
b(index(r))=b(index(r))+q(r,n);
end
end
簡單解釋一下,這裡在組裝方程Au=b的右側b向量,需要首先利用網格節點索引(一個3XN矩陣)去查找所在單元的三個節點編號,然後用這組節點編號去計算該單元對應的一個參數q,然後再把這個參數放在b向量中節點編號所對應的位置上,每次存到重合節點位置時累加。
但是multigrid求解時需要遞歸調用這部分函數,所以這個嵌套循環就非常拖後腿。於是自然就想把它向量化。一開始完全沒有頭緒怎麼不用循環實現「多次存入重合位置累加而非覆蓋」這個效果。結果在google上一搜「matlab+array+assignment+accumulate」, 第一條立馬貼心地給出了MATLAB這個神奇的build-in function: accumarry.
於是優化後的代碼就變成了這樣:[delta,abc]=basfun(VX,VY,EToV);
q_mean = 1/3*delta.*(qt(EToV(:,1))+qt(EToV(:,2))+qt(EToV(:,3)))/3;
loc = reshape(EToV,3*N,1);
b = accumarray(loc,[q_mean;q_mean;q_mean],[length(VX),1]);
速度快了很多。同時也get到了新技能(°?°)?
總而言之就是多多折騰以前寫過的code吧,看還有哪些改進的空間,而不是「跑通就行」寫完就扔了。matlab central的cody是一個練習MATLAB編程的好地方。
那我自己經驗來說吧,剛開始只知道基本語法,需要實現課題,編程時各種循環,整個程序跑完得好幾分鐘。然後網上看matlab矩陣運算的方法,接著就著手把程序改為矩陣運算,改完程序就跑幾秒鐘(^_^)。這個改程序的過程就是真正學習提高matlab編程的過程,現在我編程已經不需要像之前先循環在向量化,而是直接矩陣計算,當然線性代數中矩陣計算要熟悉。大致就是這樣的。
今天想寫程序員應該知道的編程技巧和思維方式
1、重構是程序員的主力技能。
2、工作日誌能提升腦容量。
3、先用profiler調查,才有臉談優化。
4、注釋貴精不貴多。杜絕大姨媽般的「例注」。漫山遍野的碎碎念注釋,實際就是背景噪音。
5、普通程序員+google=超級程序員。
6、單元測試總是合算的。
7、不要先寫框架再寫實現。最好反過來,從原型中提煉框架。
8、代碼結構清晰,其它問題都不算事兒。
9、好的項目作風硬派,一鍵測試,一鍵發布,一鍵部署;爛的項目生性猥瑣,口口相傳,不立文字,神神秘秘。
10、編碼不要畏懼變化,要擁抱變化。
11、常充電。程序員只有一種死法:土死的。
12、編程之事,隔離是方向,起名是關鍵,測試是主角,調試是補充,版本控制是後悔葯。
13、一行代碼一個兵。形成建制才能有戰鬥力。單位規模不宜過大,千人班,萬人排易成萬人坑。
14、重構/優化/修復Bug,同時只能做一件。
15、簡單模塊注意封裝,複雜模塊注意分層。
16、人腦性能有限,整潔勝於雜亂。讀不懂的代碼,嘗試整理下格式;不好用的介面,嘗試重新封裝下。
17、迭代速度決定工作強度。想多快好省,就從簡化開發流程,加快迭代速度開始。
18、忘掉優化寫代碼。過早優化等同惡意破壞;忘掉代碼做優化。優化要基於性能測試,而不是糾結於字裡行間。
19、最好的工具是紙筆;其次好的是markdown。
20、Leader問任務時間,若答不上來,可能是任務拆分還不夠細。
21、寧可多算一周,不可少估一天。過於「樂觀」容易讓boss受驚嚇。
22、最有用的語言是English。其次的可能是Python。
23、百聞不如一見。畫出結果,一目了然。調試耗時將大大縮短。
24、資源、代碼應一道受版本管理。資源匹配錯誤遠比代碼匹配錯誤更難排查。
25、不要基於想像開發, 要基於原型開發。原型的價值是快速驗證想法,幫大家節省時間。
26、序列化首選明文文本 。諸如二進位、混淆、加密、壓縮等等有需要時再加。
27、編譯器永遠比你懂微觀優化。只能向它不擅長的方向努力。
28、不要定過大、過遠、過細的計劃。即使定了也沒有用。
29、至少半數時間將花在集成上。時間,時間,時間總是不夠。
30、與主流意見/方法/風格/習慣相悖時,先檢討自己最可靠。
31、出現bug主動查,不管是不是你的。這能讓你業務能力猛漲、個人形象飆升;如果你的bug被別人揪出來.....呵呵,那你會很被動~≧﹏≦
32、不知怎麼選技術書時就挑薄的。起碼不會太貴,且你能看完。
33、git是最棒的。簡單,可靠,免費。
34、僅對「可預測的非理性」拋斷言。
35、Log要寫時間與分類。並且要能重定向輸出。
36、注釋是稍差的文檔。更好的是清晰的命名。讓代碼講自己的故事。
37、造輪子是很好的鍛煉方法。前提是你見過別的輪子。
38、code review最好以小組/結對的形式。對業務有一定了解,建議會更有價值(但不絕對)。而且不會成為負擔。管理員個人review則很容易成team的瓶頸。
39、提問前先做調研。問不到點上既被鄙視,又浪費自己的時間。
40、永遠別小看程序員。
這些我猜你都知道,但是做起來就很困難了!加油吧
有任何問題可以加關注,給我發私信,或者加Q~ 1569320682
matlab是默認不作為編程語言的。
首先,第一、matlab 簡單一點說就是一個超級牛逼的科學計算器而已,現在其中的函數庫越來越豐富,對你本身的coding能力要求非常低了,沒有必要刻意的去記這些函數的功能,需要的時候查一下ok了。第二、matlab可不能看做一個編程軟體(當然它也能用來編程),它最重要的用處是對你的課題或者項目中得演算法或者模型做模擬,所以matlab的使用者最關注的點應該是你的演算法設計與模型設計,當你一兩個課題做下來,matlab自然也就用得不錯了。
推薦閱讀:
※如何形象的描述反應式編程中的背壓(Backpressure)機制?
※怎麼去矽谷做碼農?
※圖像處理用python 還是matlab?
※如何學習程序結構力學?