MATLAB中內置了哪些函數是本科生常用的?
首先,自我檢討:我把MATLAB用成了C++。(我剛剛自己編了一個求最大值的循環,突然發現MATLAB有max這個函數,我就有了深深的愧疚。)
我想請對這款軟體熟悉的人列舉一些本科生常用的函數和MATLAB中的名字。讓我少走一些彎路,真誠的感謝你。
我剛試了下就試出來max,min,plot,inv,det,zeros等這幾個算是built-in function。
其實MATLAB下更多的函數都是MATLAB自己的語言編寫的,不信你在命令行里打個open unique,open fit, open nlinfit, open polyfit看看。
我啰嗦了這麼多其實是想說,很多人都喜歡說自己原來把MATLAB當C++用,可是那些驚艷到他們的MATLAB的功能,很多C++標準庫里就有。而且也沒見過他們用MATLAB里的函數指針、面向對象等技術。。。
我知道樓主在這裡肯定要不到想要的答案的,雖然幫不上忙,但是我儘力,所以剛剛花了幾分鐘寫了個py腳本提取了一下自己1900+個m文件的「函數」出現頻率前100的,如下(函數加引號是因為沒法區分出函數和變數來,所以自己人腦區分吧~):
("size", 1147) ("subplot", 1141) ("zeros", 1099) ("ones", 814)("sym", 670) ("abs", 669) ("title", 652) ("find", 566)("max", 563) ("figure", 548) ("min", 522) ("subs", 459)("findsym", 436) ("set", 422) ("fprintf", 381) ("ylabel", 346)("sqrt", 346) ("exp", 268) ("sin", 250) ("randn", 250)("imshow", 236) ("cos", 235) ("xlabel", 223) ("reshape", 219)("floor", 187) ("diag", 176) ("eye", 162) ("wrcoef", 161)("log", 158) ("num2str", 156) ("rand", 152) ("axis", 149)
("repmat", 147) ("colormap", 144) ("linspace", 136) ("double", 128)("get", 128) ("norm", 123) ("wcodemat", 120) ("alphaall", 120)("isempty", 114) ("fftshift", 111) ("imread", 110) ("sort", 109)("fft", 109) ("log10", 108) ("load", 103) ("uint8", 103)("isfield", 99) ("strcmp", 99) ("while", 91) ("round", 90)("inv", 88) ("close", 72) ("transpose", 72) ("real", 71)("power", 71) ("std", 66) ("elseif", 64) ("fgetl", 64)("mod", 63) ("contour", 62) ("for", 62) ("sign", 59)("fft2", 56) ("meshgrid", 56) ("mvnrnd", 53) ("xlim", 50)("stem", 50) ("sim", 48) ("fopen", 48) ("ceil", 47)
("str2num", 47) ("legend", 46) ("wavedec", 46) ("detcoef2", 43)("wavefun", 42) ("ifft2", 42) ("uimenu", 40) ("cumsum", 39)("freqz", 38) ("wavedec2", 38) ("tan", 37) ("wrcoef2", 37)("text", 34) ("ifft", 34) ("sinh", 32) ("clabel", 32)("betaall", 32) ("fliplr", 31) ("findobj", 31) ("not", 30)("imwrite", 30) ("strcat", 30) ("conv", 30) ("randperm", 30)("fclose", 29) ("intersect", 29) ("setdiff", 29) ("fix", 28)[Finished in 0.8s]代碼:#coding=utf-8
import os
import re
fundict = {}
invalidlist = set()
for filename in os.listdir("./"):
if not filename.endswith("m"):
continue
# 文件名不是系統函數
invalidlist.add(filename[0:-2])
for line in open(filename):
comments = line.find("%")
if comments &>= 0:
line = line[0:comments]
# function xxx不是系統函數
result = re.findall(r"functions([A-Z_a-z0-9]+)s*(",line)
if len(result):
invalidlist.add(result[0])
continue
# 被賦過值的是變數不是系統函數
result = re.findall(r"([A-Z_a-z0-9]+)s=",line)
if len(result):
invalidlist.add(result[0])
result = re.findall(r"([A-Z_a-z0-9]+)s*(",line)
if len(result) != 0:
for foo in result:
# 長度小於3,有大寫或_的不是系統函數
if len(foo) &<= 2 or len(re.findall("[A-Z_]",foo)) or foo in invalidlist:
continue
if fundict.has_key(foo):
fundict[foo] += 1
else:
fundict[foo] = 1
for key in fundict:
if key in invalidlist:
fundict[key] = -1
dict= sorted(fundict.iteritems(), key=lambda d:d[1], reverse = True)
for i in range(0,100):
if (i+1)%4:
print dict[i],
else:
print dict[i]
lookfor + 關鍵詞查查不就行了?
fft
matlab用的比較多,但是水平比較渣,寫出來的代碼基本都是小白level的,也就是以能算通為目的,很少做語言和演算法上的優化(因為目前處理過的東西都是數據量和計算量不大的東西,沒需求就沒動力做優化=。=)
所以估計一些經驗比較適合題主這種同樣初入門的人。首先,matlab下寫代碼,牢記關鍵詞 矩陣運算。因為基本上基礎矩陣運算,matlab都自帶函數了,數據存儲也是以向量,矩陣,高維數組or高維矩陣(術語不專業的的話請自行忽略=。=)的形式存在的。所以一切矩陣運算都很方便。比如求解矩陣方程Ax=b,直接用x=A, 並且A可以是square或者rectangular,後者會自動求出least squares method的解。比如求矩陣特徵值和特徵向量是eig,對矩陣做SVD分解就是svd。。。
舉這些例子首先是想說明,1,線性代數入門學的那些東西matlab都做了很好的演算法了,直接用!2,擅用help命令 前面我舉的這三個函數的例子,發現了沒有,函數名稱或者說代碼寫出來基本和你在數學書上學的很類似,寫代碼的時候,即使你是第一次或者第二次用matlab的新手,我相信只要藉助百度+help,你都能找到對應的正確函數。關鍵詞 矩陣運算 下的另一個tip就是避免題主問題描述里的情況,把matlab寫成c++,比如我最開始用matlab的時候也是不管什麼函數都想用for循環(工科渣渣 0 coding基礎大一上手學的c++,還用的是譚浩強課本,請自行腦補=。=),比如最簡單的求和都要寫個sum=0, for ii=1:n sum=sum+a(ii)*b(ii) end這種形式,後來發現這種寫法簡直腦殘,很多情境下的求和都可以變成row*vector。所以,請學會擅用矩陣運算!
matlab自帶函數和演算法非常多,因為它的定位就是給工科的人做計算用的,窮舉常用函數是舉不出來的,但是只要牢記 矩陣運算,擅用help命令,以及新手們再佐以萬能的百度,基本入門需求就夠了。數組矩陣相關:max,min,mean,var,std,tabulate,inv,repmat,flipud(忘記是不是這樣拼?),diag,ones,zeros,eig
插值擬合:regression,interp1,fit
url:urlread
字元:eval,strcat(用來批量構造文件名會用到)
畫圖:plot,plot3,surf,ezsurf,ezplot
解方程:solve,dsolve,fminbnd,fminsearch,ode45
類型轉換:什麼2什麼的,例如num2str,很多
其它想到再說fsolveode45
ode15s
fminconfminunc 以上是我認為工科中比較常用的函數。具體怎麼用詳見help我猜你c++求max不是用std::max_element而是用循環
沒有本科生的,碩士生的,博士生....專用函數,都是一個工具而已。建議先找一本最薄的書來瀏覽一遍。下面做項目的時候,需要用的功能,Google,help命令,甚至百度也可。MATLAB使用時應盡量避免使用循環,如果函數庫沒有需要的函數又要用到大量循環的可以考慮用Matlab API,用C++和Matlab混編實現你需要的功能。MATLAB是功能強大的模擬語言,且簡單有效,相信你稍微學習一下就可以用到很好。
可以看手冊,或者經常看看matlab相關的論壇,上面有總結的
要用什麼先百度一下,再看看help
建議題主先去找本書看看,先深入理解一下MATLAB的原理以及應用,先不要急著想能有什麼大用處 。想將一樣東西運用自如,必然是對其充分了解,軟體也是如此。
像MATLAB, mathematica 這一類軟體都有著豐富的函數庫,而且是免編譯直接可調用的,這正是這類軟體的優勢,不然我們直接去編程就是了,還用這軟體幹嘛哦題主這問題太偷懶額,無法授之以魚啊,還是不對題的說方法吧……
首先,基本你在數學課本上學到的函數都有,網上有常用函數手冊down一個放手邊查著用,題主自己找吧,要那種簡潔的,只有函數名和用途的(因為這樣比較薄),需要用的時候查help看用法,matlab會用help很重要。然後捏,matlab有很多加速的技巧,千萬別用c或c++的思維來寫程序,那樣會死的很慘,一個小程序跑你個幾小時都是可能的。能用向量就不要用循環,能用矩陣運算就不要用元素運算,矩陣運算用好了簡直快的飛起啊 ……總之呢,每當你想寫邏輯語句的時候,都要慎重……matlab自帶幫助而且有搜索的功能。
當你覺得你得用循環、建函數來實現某種功能時,就要搜搜有沒有符合你描述的函數或命令了。matlab里對數值運算提供的功能很多,尤其是涉及矩陣運算時再去用數組、循環什麼的運行效率就低很多了。題注也可多翻翻手冊,那些個功能很多都是初學編程時要用c啊c++啊實現的,很容易理解。
推薦閱讀:
※零基礎學matlab,需要哪些基礎知識?
※matlab畫圖坐標軸標註問題,畫紅圈的地方應該怎麼畫?
※matlab遺傳演算法解決多約束的mtsp問題?
※用MATLAB如何找到軌跡圖中的拐點?
TAG:MATLAB | 本科生 | 函數 | 普通高校本科層次大學本科 |