為什麼有些程序員會鄙視MATLAB?
有些[誰?]程序員會鄙視MATLAB,甚至認為MATLAB不是一門語言,到底是為什麼,是因為MATLAB容易學嗎?
回答評論
1. 一般來說,做科研模擬模擬的確很難超越Matlab。能有Matlab就一定會用,節省時間、而且演算法可靠。我只遇到過一次做一個激光場分布的計算,沒有用Matlab而直接用C++,只是因為當時有一台IBM的新機器,是128位的特殊Unix系統。就直接用源碼編譯運行。大概算了一個星期左右就出結果,還是很快的。當時一台3、5萬的工作站要跑兩三個月也未必能算完;
2. 我們學校Matlab集群應該部署很多年了。百度「東南大學+Matlab」即可找到使用方法;
3. 做科研,Matlab是很重要,但一些C與C++的基礎編程也很重要。不是能編寫GUI或者Web就是編程。
其實這麼多年來的新進研究生,在編程能力上的自我評價在改變。以往都說自己能夠調試多少行代碼,熟悉哪些演算法。現在來的研究生,說自己編程能力強,只是會寫GUI,或者能弄個網站,寫一點javascript。這與我們在科研工作中的編程是差的比較遠的。如何做插值,如何保證沒有累積誤差,如何找到合適的神經網路結構與避免局部最優,這些才是我們需要研討與培養的編程能力。
—-原來回答
我來發表幾點自己的想法1.MATLAB 是一個研究工具而不算一個構建工具。如果將其與C,C++,JAVA等做對比是不合適的。我們會比較示波器與計算機嗎?也因為這樣,許多程序員可能不會理解MATLAB的效用。
2.MATLAB 對於主機性能要求還是比較高的。我們科研中一般會將MATLAB部署在最好的工作站上,然後共享使用。這與伺服器類似。一般機器上跑MATLAB,特別是做上規模的模擬是很難的。3.研究MATLAB的圈子比較小。目前高校研究生或許在做項目時候會用MATLAB,但研討計算機編程技術大多在C,JAVA等。主要原因之一是就業。而一些高層次MATLAB編程,大都是博士階段。其實模擬中,每個環境用什麼樣的計算方法,都是要細緻研究,否則會浪費很多的時間。這樣的研究圈子很小,用電郵研討會更多一點。我想用好MATLAB是需要環境的,我有兩點想法:
1. MATLAB 很考驗計算資源,需要用足夠強大的機器才能發揮其作用。目前我們學校與mathwork公司簽訂了大客戶合同。校園內部免費使用MATLAB,同時在一個大計算機集群上部署了400個開放用例,校內師生可以做大型模擬。2. 需要做一些深度高階的培訓。目前市面上的MATLAB還比較初級。一些高階使用,比如用GPU加速計算方面,都沒有涉及。有限元方面,人工神經網路方面都還是N年前的資料。需要更多高手做點培訓。我還是很感謝能有MATLAB這樣的工具使用,應該說MATLAB是一個軟示波器,能夠助力我國基礎研究發展。只有用好它,沒有什麼鄙視的。走歪了的科研狗來答一發,靠matlab入編程的門,進行數據分析,現在已經轉到python瞎搗鼓。
打個比方,matlab是一個偏科很嚴重的工科特長生,但程序員更喜歡各方面均衡發展的全科生。
程序員的工作是啥?寫爬蟲,做軟體,開發遊戲,做網站搭伺服器等等,matlab能實現嗎?其實部分功能是可以的,但是編程體驗和用戶體驗比較差。
Matlab的長處在於,控制系統設計與分析、金融工業建模和模擬模擬等。這裡有個匿名用戶的更專業的回答來說明這一點,給大佬打call!!匿名用戶:為什麼很多程序員會鄙視MATLAB?這些功能如果讓程序員來用其他編程語言能實現嗎?顯然是可以的,但是投入的時間成本顯然比直接學習matlab模擬模擬工具箱要大得多。重複造輪子並不好玩,而且造出來的輪子還不一定比matlab好用。
===================================
一本正經的回答環節結束,接下來是知乎答題講個故事環節
===================================
脫離matlab坑的原因之一,就是要把我們開發的一個新演算法做成一個軟體推廣應用,一開始用matlab的GUI實現了這個軟體,拿著m文件給導師,被反駁:萬一別人沒有matlab怎麼運行?那就編譯成exe唄,然後編譯完,文件大小直逼1GB,相當於把matlab的內核都編進去了
用之前還要安裝十多分鐘。。。結果打開一看是個很基本的功能界面,用戶體驗極差。
評論區 @總是在發愁 說的比我詳細,特此引用一下
做了模塊m文件轉成dll給c++調用,沒有matlab的環境要安裝打包的matlab compiler runtime然後各種設置,載入的方式變數定義啥的都要改變,確實比較麻煩,但是確實寫m只用了幾十行,c++下估計得好幾百行,另外m轉c代碼的話對版本還有要求,轉的代碼還不盡人意,不知道有沒有隻打包所需lib和h文件的方法
後來用python重新實現,代碼量減少了一半不說,編譯完了之後的exe只有20MB,點開就能用,順手還用flask搭了個伺服器弄了個產品網站:www.uav-hirap.org
emmmmmmmm,所以說是走歪了的科研狗哈哈哈
我不是程序員,我是攻城獅。我不寫軟體,但是我每天要做各種數值運算,大型矩陣、偏微分方程、非線性優化。我寫的matlab程序,一般來說源代碼只對項目組一兩個人公開,其餘人想讀都沒有許可權。不需要很好的可讀性。事實上,只有我看懂其餘人都看不懂才符合公司利益。如果項目做得好,結題前我會花一個月寫文檔,把數學模型和數值演算法寫清楚,但不會花太多時間在代碼里添加註釋。重要的是數學模型、實驗數據、以及運算結果,而不是代碼。我們的攻城獅每小時人工成本幾百到上千塊錢,用C++碼代碼,心疼啊!所以,我崇拜MATLAB。
很多公司是先讓工程師用MATLAB寫出演算法, 然後讓程序員用其他語言改寫,用於加速或者做成軟體。
這就比較讓程序員尷尬了。
1 MATLAB程序經常出現的向量化, 對於程序員來說, 非常不適應。
2 MATLAB程序雖然從代碼來看, 並不太複雜, 但涉及到的專業知識可能是程序員不具備的,導致程序員理解起來困難。
3 一些使用MATLAB的工程師的代碼水平在程序員眼裡不敢恭維。
總之,還是因為部分程序員不得不和MATLAB打交道, 才導致程序員對MATLAB有怨氣。
其實最主要的鍋不是MATLAB, 而是不得不接手別人的代碼。如果是同一個語言的話, 程序員會把氣撒在人上,說上家的代碼水平低, 如果是MATLAB代碼的話,程序員會把氣撒在MATLAB這個工具上。
補充分割線--------------------------------------------------------------------------------
經過評論區的有些人提醒, 使用了一下最新版MATLAB的coder工具箱, 感覺比以前(剛剛推出coder的時候)好用很多了. 支持更多的函數, 另外試了一下, 即使是向量化集中的演算法, 也能大幅度加速.
看來, 大部分的加速代碼工作可以不用勞煩程序員了.
最近幾年MATLAB的進步神速, 如果不使用最新版本的MATLAB的話, 對MATLAB的認識很可能過時了.
反駁一下 @立黨 的一些過時或者錯誤觀點(他老是在評論區刪別人反駁他的評論, 也許他現在根本不關心MATLAB是什麼樣了, 已經不用了, 但是有必要指出他的錯誤觀點, 以免誤導別人, 因此在這裡進行反駁):
1 閉源?
比較底層的函數確實閉源, 但是大部分(目測95%以上)函數是開源的, 可以查看代碼, 甚至修改(本人經常這麼做, 為了加速, 將一些輸入格式檢測的代碼去掉)
2 龐大而臃腫的IDE?
整套MATLAB確實越來越大, 但是你可以選擇安裝你需要的toolbox啊, 不用全裝. 類比一下, 你喜歡功能強大的visual studio, 還是小巧的vim,然後自己折騰各種插件, 這是個人愛好.
我個人來說, 很喜歡這個IDE. 唯一不方便的地方就是開機後打開MATLAB慢了一些.一周開機一次, 影響不大.
3 殘缺的OOP?
這個觀點我無法理解, 具體怎麼殘缺, 希望他指出來.
學習資料推薦《MATLAB面向對象編程——從入門到設計模式》
4 循環速度慢?
MATLAB的循環經過了大幅度的提速, 有時候甚至快過向量化.
可以參考我之前做過的測試:
芷菡:如何評價 MATLAB R2016b ?
5 畫圖丑?
版本R2014b引入了新的畫圖系統了, 美觀多了.
6 品控很差?
能否舉例說明?
7 mex容易崩?
那也是你代碼寫爛了, 這也怪MATLAB? 為什麼不用C++寫一個main函數, 測試一下你寫的代碼. 另外, 可以使用coder自動生成mex, 速度也挺快的.
2017年12月補充:
評論區噴子太多,down vote的人肯定也很多,我摺疊了很多純為了噴,沒有乾貨的評論。
如果真有不服氣想噴我的人,不妨用C++和Python各寫一個CPU並行計算包,跟matlab的CPU並行計算對比一下運算速度和開發速度,能比得上了,再來噴。(我就不說GPU並行計算了,先把CPU的版本寫好了再說吧)
其實,真能寫出來的牛人,應該是不會盲目自大的去鄙視matlab的。
以下為原回答
----------------------分隔線----------------------------
以Matlab之強大,還真輪不到知乎上大多數人來鄙視。
本人是科研工作者,C/C++,Java,Fortran,Python,R,Matlab都用過,對於學術圈中的編程語言使用,算是有點發言權。
(1)Matlab有成熟的語法。雖然有不少缺陷,但還是比Fortran和R要優美的
(2)有非常豐富的內建函數和內建工具箱(toolboxes)。只要是科學相關的,什麼優化、機器學習、信號處理、圖像處理、金融經濟,基本你能想到的,Matlab都有。另外,Matlab內置函數豐富,就基本不會出現像R那樣經常性的namespace衝突
(3)有面向對象編程的功能。什麼繼承、封裝、多態等等,都有。不像R和Fortran,雖然號稱能面向對象,但是是瘸腿的
(4)強大的符號計算功能。雖然比不上Mathematica,但和Maple一樣強大,對於大部分情況,應該夠用
(5)在常用動態語言中,運算速度相當快(不過當然比不過編譯語言)。即使不使用向量化的寫法,暴力嵌套for循環,單線程,Matlab也經常比Python快(本人親自測試過,循環體里只有兩行數學計算式子,Matlab比Python快了300倍)。另外,Matlab的多核多線程計算效率非常高,開發也很方便(把for改成parfor即可)。很多Matlab的內建函數都自帶多線程,底層代碼優化得相當好。Python雖然也有一些多線程包,但我試過之後,速度都很難方便達到「單核速度 x 核數」(因為其語言設計的原因)。對了,Matlab還可以方便地進行GPU運算,在此不贅述
(6)IDE友好,debug功能強大。Matlab的IDE就是為了科學技術工作量身定做的,和Visual Studio這種為碼農量身定製的IDE是不同的風格。這兩年來大熱的Spyder也是照著Matlab IDE的路數改進的。Fortran作為一門科學計算語言,只能用print來debug,或者借用Visual Studio這種不合適的IDE,用起來很彆扭。R語言有Rstudio,但可用性比較低,運行出錯之後,經常不能顯示function call stack,讓人怎麼debug。
(7)Matlab真正作為一個「工具」而不是一門「語言」的殺手鐧是simulink。simulink其實是個大型商業軟體,相當於solidworks、ANSYS、ArcGIS、SPSS、Bloomberg Terminal,能做的事情比general purpose編程語言要精專得多
(8)Matlab作為付費軟體,還有附加福利,就是非常完整的幫助文檔,以及一個工作日以內必能回復郵件的人工客服(我真的經常問他們各種技術問題)。開源世界的幫助文檔必然寫得比較凌亂(Python算是比較好的了,scipy/numpy/PIL/statsmodels這種大型第三方包的作者們都會認真寫文檔。R的文檔簡直差得令人髮指,很多內建函數的介面都描述不清,還不給例子。至於Fortran,都淪落到只能靠wikibooks的地步了)
我一直在思考一個問題,都是使用「工具」的各位,為什麼要鄙視另一個使用「工具」者,並且以工具的上手複雜度形成鄙視鏈。我從來不覺得會python、C++、Go、Java、Matlab等任何一種「工具」的人會特別牛。這些工具好比一名武師手握的一把劍,一開始練武之人需要一把合適的劍,練習招式。一般武師拘泥於招式,注重劍的鋒利而真正的大師則是天馬行空,摘花飛葉皆可傷人。其區別就在於思想的深淺,眼界的高低。不知道大家是否明白,達到的結果才是最重要的。
大概是不了解MATLAB或者是沒有按照MATLAB的思想去使用吧
比如MATLAB裡面使用向量計算的速度,遠遠高於把向量當數組去一個一個取出來計算的速度
這些因為思想的不同造成的誤會讓很多程序員認為MATLAB很糟糕,其實深入了解以及使用後,會發現MATLAB是個神器
因為matlab擁有世界上絕大部分純Computer Science出身程序員深惡痛絕的幾個特點:
- 閉源且收費,差不多所有值錢的演算法和框架,都是閉源的,而且是按照toolbox收費的,而且總價格是真的貴,貴得離譜——於是開源世界造了個免費的、但性能落後、功能殘缺的octave來代替他;
- 擁有一個龐大而臃腫的IDE,並且安裝所有組件+simulink後,足足需要十幾個GB的空間,簡直是跟程序員們「每個功能都用一個小小的庫,用小小的庫管理軟體去安裝、更新、卸載,自己需要哪些就安裝哪些,高度定製化的本地庫」的思想大相徑庭;
- 幾乎全部是面向過程編程,不要想著用殘缺的OOP,也不要想著簡潔酷炫的lambda。如果自己實現一個功能,無論用mexfunction封裝還是直接寫matlab,純面向過程最後結果就是一大堆函數並列著排列,寫出來非常不優雅,看了想吐;
- 一些非常不直觀的編程習慣,比如你必須用向量化來代替循環,因為向量化可以讓矩陣庫可以直接給你開闢一塊內存,剩下的都交給C的庫來實現——而你如果在Matlab里多嵌套了幾層循環,保證讓你的程序效率堪比遠古時代的386;再比如混亂的函數命名,導致用不熟練的前提下很容易把兩個相似的函數用錯,張冠李戴;
- 真的丑,丑到哭,無論是又慢又遠古的、千年未變且不可定製的GUI,還是內置所有函數畫出來的圖,都非常直白且醜陋,跟R、matplotlib或者其他語言的流行可視化庫輸出的圖表相比簡直就是上個世紀的東西;
- 雖然Matlab庫多,但是品控很差,很多庫的錯誤提示莫名其妙但又長期不更新,simulink很多東西加了又刪,讓你用得很不省心;
- 數值運算強,但符號運算弱,這一點不多說了,用過的人都有體會;
- 擴展性差,當然你可以用C語言寫mexfunction然後封裝成函數,但是編譯過程很痛苦,調試過程驚心動魄,內存溢出則整個軟體徹底崩潰,很多時候全靠人品。
當然我作為Matlab的七年的資深用戶,對Matlab的感情非常深厚,可以說Matlab是在我心中最偉大的軟體,因為Matlab是一個儘可能地把人類社會360行里可以用程序實現的東西都實現了一遍,自己花錢僱傭工程師實現了高性能運算、模擬、可視化、必要組件等的儘可能完備的一整套開發和調試生態系統……
——但是,這些優點大部分程序員並不在乎呀,畢竟程序員總是覺得自己定製的輪子才是最好的!
其實這個世界上有很多人應該由衷感謝Matlab,是Matlab讓很多非CS的人也能在自己的領域裡用簡單的幾行Matlab程序就能高效解決問題,大大提高了工作效率,可以說Matlab對生產力帶來的真正貢獻,要比很多偏執狂們配置VIM、zsh等小玩意兒要多得多。
感覺主要是因為不是一個體系的東西所以比較排斥吧。
matlab的m語言主要關注數學建模計算,利用m語言可以很輕鬆的進行演算法設計,把演算法抽象成代碼。但是演算法設計一般是面向過程的,所以結構一般不複雜,只是理論推導卻很困難。但是程序員一般比較推崇,用各種語言,設計模式,開源架構,構建出一個複雜高效的系統。這些系統只是結構或者邏輯複雜,並不需要太多數學理論方面的東西。
程序員擅長的,matlab不擅長;matlab擅長的,程序員卻不擅長。程序員不喜歡matlab,其實也是可以理解的。
另外,蠻多程序員數學不太好,與其去硬啃那些晦澀的理論,還不如去搗鼓一些開源框架來的更快、更有成就感。這估計也是他們不喜歡matlab的一個很重要的原因。不是程序員,會的編程語言不多,還是想說一點。
個人感覺:
C語言是普通小菜刀,啥都能幹,幹啥都挺麻煩,最能體現使用者的水平;
python是大砍刀,簡單直接,快刀斬亂麻,在很多領域效果拔群;R語言是刮刨刀,只能幹很少的事,但是確實專精,極少數特定領域無敵;按這麼類比,我覺得matlab是剪刀,可以用來做菜,但是做菜確實不是主業,要做啥都可以,但在很多領域確實不好用,其真正的價值,肯定絕對不在做菜上。
你可以鄙視用剪刀做菜的方式,你可以鄙視用剪刀做菜的人,但是鄙視剪刀本身,只能表現自己見識的短淺!MATLAB 在建模的時候的方便和強大不是其他語言可以相提並論的,Python 還差了它幾十年。
可能是MATLAB現成的工具箱比較多吧,但像Python,R等編程語言,相關程序包也不少。
MATLAB既是一個軟體,同時也是一種編程語言,雖然可能上手相對容易些,但也不是button式的軟體工具了。
能直接調用的,何苦自己寫呢?明明大家,都倖幸苦苦的,到處找別人寫的代碼抄
你卻可以,按照找官方文檔,一步一步的點滑鼠.....
有一個演算法,只有Matlab版,視頻處理的,Matlab下30fps的樣子。
這個演算法效果相當牛,准產品級,我想改成c吧,速度不得吊打Matlab.
用了小一個月改成c,跑一下,what?! 12fps,仔細查了一下,c下多維矩陣的運算速度直接被Matlab秒殺。
50*50*28*10的複數矩陣點乘,Matlab一條語句就完成了,在c下,差一點的做成數和數相乘,好一點的做成二維矩陣相乘,再優化,變成兩個很大的矩陣相乘,這些都要根據演算法去個性化處理,然而,Matlab,一句話的事。
debug版本,Matlab,不存在的,你想看啥,隨便看,什麼列印矩陣,保存矩陣到本地,沒有的事。
矩陣實驗室分分針教你什麼是矩陣運算。因為下標從1開始。。。
這就是典型 matlab 程序員的代碼風格。
一直認為Matlab只是工具,不是語言。和lindo,lingo,maple一個級別。
大學裡弄數學建模的時候用,因為解題,寫演算法非常方便,語法簡單,生成圖像非常便利。
但是程序員的工作不是解題,而是編程項目。
一個編程項目往往涉及很多聯動,基礎的有:編程語言與資料庫聯動,前端和服務端聯動,多語言聯動,等等。
一個編程項目,不是一個演算法就能解決的,而是和搭積木一樣,需要有大量的編程工作不斷累積、疊加。
在程序員中,鄙視matlab是不會存在的。程序員鄙視的,大多是會用一點編程工具,就低估了程序員工作難度的人。
因為 matlab 作為一門語言,不具備某些範式,導致用起來十分彆扭。這是其一。
matlab 的確擅長科學計算,但是 python 加上 numpy 也不錯。後來我就明白了,科學計算需要的只是一堆實現數值演算法的函數,沒必要造個語言出來
作為程序員來說,當然是鄙視 dsl,喜歡應用面儘可能廣的語言,這樣交流成本就會很低。與此類似,某些伺服器(我就不點名了)的配置文件本質上還是 dsl,所以也受到很大的鄙視。
以上。
我不是程序員,是 MATLAB 用戶,我鄙視 MATLAB 的原因是閉源和禁運。
我曾經在 mathworks 官網上購買學生版的 matlab,使用了四川大學 http://stu.scu.edu.cn 的郵箱後綴,付費後收到郵件,被告知我的學校在禁運名單上,不能向我出售該軟體。後向 mathworks 中國致電,同樣被告知我無法合法使用 matlab。那麼多美企都有辦法規避禁運條例,把軟體賣給中國高校,mathworks 為什麼不行?
真心沒鄙視過Maltab,反而覺得它特別高端,會的人也特別厲害,因為我不會。
推薦閱讀: