為什麼 MATLAB 的矩陣表達這麼反直覺,代碼不優雅,並且符號計算這麼差,還是有這麼多人用它?功能實現上比 C 好在哪裡?以及如此流行是因為它功能強大兼/或易用嗎?
此外,在具體的使用領域裡,是不是都有取而代之的更為簡潔,更加專業的軟體呢?
第一名匿名用戶的回答很好了。補充幾點:
(0) 還是要強調的是matlab是給工程師而非碼農用的。如果不了解工程領域,至少應該知道在software之外還有firmware這麼一個世界吧,不然C語言怎麼還會佔據如此大的市場?
(1) Matlab有符號運算啊,symbolic math toolbox,不過這點上應該沒有mathematica強,但這本來就不是matlab的重點,基於矩陣運算的快速演算法開發和驗證,以及模擬才是核心。
(2) 矩陣表達反直覺?理工科沒學過線性代數不可能,但就算是純碼農也不應該說出這樣的話啊——有多少演算法是跟矩陣有關的啊!工程領域,許多公式的矩陣表達無比簡潔清晰,比循環語句/求和函數什麼的看起來清楚多了
(3) Matlab的發家是從控制系統/信號處理等開始的,逐漸擴展到其他領域,例如統計,金融等。這些裡面有許多的演算法(這是更廣意義的演算法,不是狹義的CS領域的,雖然許多也有關係,例如FFT),用matlab編寫這些演算法的效率比C高10倍都不止,也就python這些年附帶了許多庫在某些領域也比較強,但更多也是在偏碼龍行業的例如數據挖掘等,論工程領域演算法的全面性,matlab那麼多年積澱和現在toolbox的發展已經讓後繼者無法超越了——例如我現在需要一個IIR濾波器滿足xxx性能,嗯...或者我要對一些信號做頻譜分析,然後提取需要的部分做進一步計算和統計分析並畫圖給老闆看:你用C一天時間寫個FFT和假設檢驗再做一個畫圖程序?就算是找到現成庫(找的時間還不知道多久呢),把他們集成起來也得要點時間吧——而這樣的事情用matlab也就幾十行代碼,一個小時coding加test就搞好的事情,然後就是大量時間去做實驗采數據做驗證了——驗證不成功,再花一個小時換另外一種improve的頻譜分析演算法試試。
(4) Matlab可以很方便跟其他語言集成的,互相對調,一些新演算法的開發驗證在matlab里實現,而外圍的功能用其他語言
(5) Simulink在控制系統/信號處理等領域是無可替代的,並且也在延伸到許多其他相關領域,例如電力系統,SimEvent等。用C寫一個工程級別的最基本的PID控制器模塊,那都是一個要納入人年計算的工程了,而這僅僅是控制系統里一個模塊,前端的數據預處理,濾波器設計,後端的信號調製:一個實際控制系統的一個子系統可能就是一個大的diagram,其中PID只是一個小模塊——你讓研發的時候就直接寫C代碼上硬體去測試,還是先模擬呢?
(6) 更重要的是matlab有code generator了,可以直接從m-file或者simulink model生成C代碼,質量還相當高(matlab後台實現本身應該就是C),這樣的代碼可以很快被直接移植到firmware去的。Mathworks現在市場活動搞得最多的就是汽車行業的model-based design,就是用模擬模型做開發直接生成代碼,可以大大提高開發和測試效率的,而且還支持hardware-in-loop的測試——直接在真實硬體環境下debug模擬模型。我覺得把MATLAB和C相比本來就是一個錯誤,這兩個誰也替代不了誰。而且全球那麼多各行各業的大公司都在用MATLAB,居然還有人說用MATLAB是因為編程能力太差,暈,那些大公司的工程師傻啊?本來就是兩代不同的編程語言,那有沒有人說用C的是因為彙編語言太差?或者用彙編語言的是不是因為人工讀101010110000010111101太差?再說,就從MATLAB的應用來說,你覺得代碼生成簡單?你覺得工業界別驗證簡單?基於模型設計簡單?金融應用程序簡單?
記得MathWorks中國工程師說過一句話,盜版讓MATLAB在中國泛濫了,泛是應用廣泛,但濫是指中國對MATLAB的應用停留在非常低的水平。在我們爭論MATLAB和R、Python等在某些領域哪個好的時候,MathWorks早就盯著工業界了。這幾年國外對於MATLAB的報道,已經很少涉及到數值計算的,大多數都是工業界,比如NASA用來製作太空梭,Tesla用來開發電動汽車等等,國外就連學生上課,也不用MATLAB來進行數值計算了,而是教學生怎麼用MATLAB來設計硬體演算法,如何應用到Arduino,樹莓派等。
本來MATLAB就是給工程師用的,就拿汽車製造來說,一輛汽車幾千萬行代碼,全人手寫代碼對人力物力和時間要求太高,這時就需要MATLAB了,何況MATLAB何有驗證工具箱,直接檢查是否符合行業那幾個標準,這就是為什麼國外的開發團隊只需要幾十個人就可以開發那麼大工作量的項目。
本來計算機語言從0101010發展到彙編語言,再到C、C++,再到MATLAB、R等,本來就是對人類越來越友好,但同時應用面越來越窄的。聽有人說過MATLAB會導致人的編程能力變弱,我覺得作為老師,教學生的時候可以這麼做,但實際工業中,人手用C語言寫一個FFT有意義嗎?人的價值在於設計出FFT的演算法,而不在於知道演算法後去浪費時間編寫,這些大家都知道的東西讓機器(或碼農)自己做就行了,工程師應該關注與有實際意義的演算法設計或流程設計。舉個極端的例子,那為什麼要用計算器呢?人工手算更能鍛煉計算能力了。正是因為計算本身不產生價值嘛。
至於MATLAB和Mathematica的對比,很簡單,喜歡那個用那個,還有python、R什麼的,喜歡那個用哪個,本來他們存在競爭就證明了各有千秋,誰也無法徹底擊敗誰。不過這些知識在數值計算、統計等方面跟MATLAB有競爭,還是那句話,MathWorks已經將視野放到工業界了。就我在工程領域內的見聞,隨便說幾句
1.
Matlab比C的最直接優點在於,matlab代碼不需要編譯,省下你無數debug的時間。只要你果真寫過「hello world」以外的代碼,自然明白這句話的含義2.
為什麼我要強調工程領域,因為matlab這玩意兒就是為工程師設計的,不是為程序員設計的。工程師對編程的需求,和程序員對編程的需求,其實是不一樣的。對程序員來說,代碼不僅是工具,更是產品,所以喜歡關注代碼本身。但對工程師來說,工具就真心只能是工具,用起來方便才是王道,至於他的工作原理是不是優雅,對不起我不關心啊。比如變數不需要聲明,不需要檢測類型。計算機科班出身的人會和你說這是多麼多麼的大忌,但實際使用中便利是很多的,誰用誰知道。
做個直觀的比較,兩種語言:一種10小時編寫,1小時運行;另一種1小時編寫,10小時運行。
程序員傾向第一種,無可厚非,因為代碼的重複使用率極高,先勞而後逸是常態。比如網站,代碼寫完了挑戰才剛剛開始。但工程師不是,我建一個模型,重要的是設計過程,重要的是這個模型的物理意義。設計完了,一個模型跑幾天幾夜根本不是事兒,我回家睡覺就是了。等到結果出來,以後這個模型再也不碰了也無所謂。所以我在乎的是設計過程,人力成本比cpu運行成本高太多。
正如樓下的 @張抗抗 朋友所說:Matlab追求的是解決問題本身的簡潔
當你還在關注「術」或「形」上的東西的時候,說明你還沒打算解決什麼基本問題
3.
為什麼matlab在工程行業內受歡迎,因為其既是科學計算,又是程序語言,還是圖形設計軟體。。。互相之間還無縫兼容,所以才強大。核心功能上確實有一些強力的競爭對手,但如果分散到各個專業領域,尤其是那些分開來賣的toolbox,就未必能找到合格的替代品了。不喜歡Matlab的人,認為某某工具比Matlab好的人,因為你們只需要使用那一種工具。所以儘管挑那一個用就是了唄。matlab還有許多為了大型建模及實體模型而服務的功能,比如Code Generation, Simulink Target, Real Time Workshop等等,恐怕是學生黨未必會接觸到的東西。所以學生黨依據日常做作業的經驗而給出的評價,我認為不全面。再說了,高校購買的student version本就不是全套功能。。。
我換個說法好了:如果對你來說matlab只是一種程序語言的話,那對不起,這東西確實不適合你用。
換個更簡單的說法:如果你用matlab而從未點開過simulink的話,那你也不用和我爭了,我懶得和你爭。
如果有人說:我覺得自行車比坦克車好用,因為輕便、節能、環保。
請問我該如何回答他呢?4.
再說個中國用戶普遍體會不到的優點:售後服務。正版matlab包含tech support,24小時電話伺候,無論是有bug還是自己不會用,神馬問題都可以問。個人用戶不覺得什麼,對企業用戶來說有售後沒售後是完全不同的概念。舉一個實際工作中遇到的例子:
你覺得python免費好用,各種開源的library也應有盡有,你覺得碉堡了,花錢的matlab簡直就是垃圾。然後你寫了個程序,但是結果就是算不對。這就屌了,你不得不花好幾天的時間去debug。最痛苦的不是bug,而是你始終懷疑這個bug不是你自己的,是免費開源代碼自身的漏洞——我這裡指的不是python的漏洞,而是第三方工具包的作者可能自己犯錯了經過了一個星期的努力,掙扎吧,在血和暗的深淵裡,你終於確定了是代碼自身的問題。
這時候就更屌了,人家是免費軟體啊,是開源軟體啊,誰有空來給你負責啊?你又不會自己重寫library,只好到各種技術論壇上去求助。先不說別人未必願意搭理你,就算願意,可是你才是專家啊,你乾的活別人不懂啊,所以人家也沒辦法幫你啊。就這樣又過了一個星期。然後你的工作這樣一卡就卡了兩個星期,也不知道什麼時候能夠解決。python是免費的是嗎?可是美國碼農時薪40刀/時,兩個星期的人力成本就足夠你買matlab了,還有找零5.
程序員逼格太高,跟你談演算法談架構,但是對不起啊,我們的側重點不一樣啊。好比一個醫生說青龍偃月刀不適合做手術,所以這玩意兒弱爆了。那沒辦法,什麼事都是你說了算,你贏了行嗎?過去有人提醒我不要在知乎上和程序員對噴,如今我是服了。世界上不是只有程序員一種工作,請你睜開眼睛看看別人的世界再逐條說幾個細節:
矩陣表達,據我所知這是matlab的強項,也是創業初期matlab能夠在一堆科學計算中脫穎而出的關鍵。所以這一條我實在不知道你的噴點在哪裡,請闡明細節
說matlab的代碼「醜陋」,「不優雅」。這就真沒法說了,請先定義優雅。另外你覺得C比java好看嗎?法語比日語優雅嗎?還是那句話,光說這些主觀感覺的我實在無法回答
——————————————————————————
我真是服了一些噴子了我這帖一沒強買強賣,二沒貶低別家,我連橫向比較都盡量減少了,單純分享一下自己的使用體驗而已。就這樣還能有人噴?還讓不讓人說話了?知乎是你家開的?工具就是工具,通過貶低別人的工具來彰顯自己水平的人,我真是開眼界了,水平真是驚世駭俗啊。有不同意見的我歡迎交流,至於滿嘴噴糞的我勸你三思,這畢竟是我的地盤,到時候你辛苦半天噴出一大坨,我點點滑鼠就給刪了。你說到底是誰比較酸爽呢?MATLAB並沒有反直覺,如果你自己沒有數學和矩陣論上的思維,就感覺它反直覺。
簡單回答吧:Matlab追求的是解決問題本身的簡潔,而不管程序本身是否簡潔,用Cpu的時間來換取解決問題者的時間。當你還在關注"術"或"形"上的東西的時候,說明你還沒打算解決什麼基本問題,因而也無法體會到它的好了。
Matlab是收費的。你以為你花的$2000的license是用在Matlab interpreter上的嗎?錯。你是把錢花在了上百個能把全世界所有工程領域上的東西建模的大部分toolbox上,以及能直接成為工業生產力的simulink上。你的全部學習成本,就是花2分鐘看懂文檔,無論是控制系統,還是神經網路,還是個視頻解碼器,你都只需要一行語句就能直接調用,而且保證沒有bug。
也就是說,你花了幾千刀,讓全世界的工程師把你可能用到的經典演算法和庫都實現了一遍,你只要一行就能調用這些現成的高效且有保證的演算法,然後可視化出來。
那麼問題來了,上面這些東西分別讓你在C語言里分別找開源的免費的庫,分別學習一遍,你能用1個小時完成么?題主是有多麼不想學Matlab啊,感受到題主對Matlab森森的抵觸呀,哈哈哈,不要拖延症啦同樣一個問題用c的人還沒編譯通呢,用matlab的早都完成任務摟著妹紙回家啪啪啪啦,哈哈哈當然啦,蘿蔔青菜嘛,題主堅持用C,就是不用matlab,也敬你是條漢子~
以下答案根據純屬個人經驗,不保證普適性。
因為,一般工程師真的沒有學過編程,真——的——沒有學過。
代碼規範什麼的沒有人在乎,而他們常用的函數一般都有自帶。所以,豐富的函數、功能基本齊全的IDE再加上為計算特製的語法讓Matlab成為就是一部很好用的計算器。而且,工程界的使用者多,什麼函數API混亂也好,奇怪的行為也好,坑都讓別人踩得差不多了,很多workaround都能找到。
不過,有人覺得自己計算器用得很好,希望用計算器編編程,災難就開始了。
(我也見過寫得很好的Matlab包,但是我個人眼力所及的Matlab「程序」,我只能呵呵了。)
控制行業離不開Simulink又是另外一個話題了。 關於這個問題, @Linglai Li 的答案寫得很好了。引用知乎常用的說法:「不問是不是就問為什麼是在耍流氓!」
首先,樓主可否說說「MATLAB 的矩陣表達這麼反直覺,代碼不優雅」體現在什麼地方?怎麼我真心覺得MATLAB的矩陣運算很牛X呢?優雅的定義又是什麼呢?
話說當年還在大學的時候,上數據挖掘/圖像處理的課程時第一次正式接觸MATLAB,瞬間覺得這個語言比C、Java、Python高大上O(N!)個數量級:
1. 「我擦!大多數時候可以不用循環唉!循環可以寫成數個精妙設計的矩陣相乘的形式唉!」
2."媽蛋!這語言好優雅!不用考慮垃圾回收哦!不用考慮指針哦!程序簡短哦!通常看不到以奇怪符號開頭的變數哦(如_,,*,#,$)!不用編譯哦!MATLAB的搜索框直接能找到API文檔哦!"
3. 最最最最重要的一點,這程序寫起來行雲流水!!!沒有語法坑!沒有過多的語法糖!一旦你清楚演算法是什麼,尤其是可以用數學語言描述的演算法,那麼當你寫起來時真的是分分鐘搞定!都不帶debug的!
有一種插入時一捅到底的感覺!有一種便秘多時一瀉千里的感覺!有種滿滿的幸福感!
我現在是寫多了MATLAB,連C/C++什麼的都有點生疏了。我覺著好用就在於,我可以用MATLAB很快地實現某個演算法或者直接調用內置函數,特別是矩陣運算特別方便。而且正如別人說得那樣,MATLAB適合探索,因為可以很方便的數據可視化。缺點就在於M是解釋性語言,速度是肯定比不過C等編譯型語言。但是我覺得先用MATLAB或PYTHON快速實現演算法,驗證了演算法正確性後,再轉成C++追求速度。當然了,我現在只在乎演算法正確性,好久不寫C了。。。
對於矩陣計算,通常把矩陣看成列向量的集合比較方便,Matlab以列優先來存儲矩陣才是符合直覺的。
主要回答一下問題,討論什麼的就算了,
1、Matlab的矩陣表達式很符合自覺啊,至少我這麼覺得;2、代碼可以寫的優雅,不優雅是寫的人的問題。另外,優雅也是個很主觀的東西;3、支持符號運算;4、很多人用,我覺得主要是使用方便與功能強大兩方面。不需要學習很多計算機、編程的東西就能使用,在很多科學計算領域都能用得上,Toolbox中東西非常多,;5、功能實現上,現在的Matlab大多是都是C實現的。好處嘛,第一不用自己寫,第二很多都採用了很好的演算法實現,自己寫的可能會很有差距,第三,實現了很多。至於不好的,因為它的演算法都有一定通用性,可能沒有對特定的領域做相關優化,而自己寫的可以;6、我覺得是-------流行是因為它功能強大兼易用。7、具體的領域,可能有,也可能沒有專業的軟體,可能比Matlab好,也可能不是;隨便說一下,個人還是很喜歡C語言的,畢竟是程序員。。。woc matlab的矩陣多好看!
就算是說matlab沒有實現完整的函數式,不支持鏈式寫法,幾乎全都是值傳遞基本沒有引用傳遞,用小括弧表示矩陣索引和函數參數,而且函數調用還可以不帶小括弧…………但是matlab的向量化設計很好用啊,把問題的直觀性提高了兩個緯度啊,你說是雙重for好看還是向量化寫法好看對不對,當然matlab居然沒有完整的函數式大大限制了向量化的使用,但是walfram語法更反人類啊,中括弧有木有。
當然,其實我個人覺得javascript或者python如果能夠配備matlab這種水平的向量化……那就可以代替php了……numpy么……哪有matlab好用啊快走開matlab挺方便的。上大學那會兒剛學C,老師要我們用C解決一些數學問題,要先搞到演算法,再來寫程序,算個行列式,做個求導什麼的普通問題都要幾個小時(當然是寫程序的時間),遇到不開竅的時候還要幾天才能解決一個問題,說實話,挺有成就感的。但是,接觸了matlab才發現自己那點成就感就是個渣渣,matlab裡面只要幾步就可以搞定一個問題。我覺得可以這麼理解,matlab也許看似很龐大,但是專門為了解決特定問題——尤其是工程上的數學問題——而設計的,而C語言,就是設計matlab用的
補充幾點:
1、matlab代碼的編寫效率很高,而矩陣表達正是它的優勢所在。沒有矩陣表達時,你寫一組線性方程,要管理幾十個變數,求解過程的表達式就寫到你手斷。這樣的代碼可讀性很差吧。採用矩陣和向量來表達,Ax=b就可以定義一組線性方程,求解的過程就是x=inv(A) * b, (也可以簡潔地寫成x=Ab),其中inv()是矩陣求逆函數。難道你不覺得這樣的代碼可讀性更強,更優雅嗎?其次,如果代碼用C寫,求解問題的維度從一維拓展到高維時,代碼量何止翻倍!但是在Matlab上,你照樣可以寫Ax=b這樣一目了然的表達式,你原來解決一維問題的代碼,經過簡單修改就可以直接解決高維問題。有了矩陣表達,你可以直接跳過所有繁瑣的細枝末節。
代碼量的減少其實是提高了程序的可讀性和程序員的編寫效率。Paul Graham在《黑客與畫家》一書中以LISP為例子:LISP代碼長度甚至可能是C的1/20,這就意味著,「C語言需要一年時間完成開發某個功能,LISP語言只需要不到三個星期」。這就是matlab的優雅所在。
2、matlab支持符號運算,功能上已經能滿足工程上推導的需要。我們做理論研究的,一般不太複雜的表達式都交給matlab運算,省去手工推導的繁瑣。
3、matlab很容易上手。我第一次使用matlab時,只粗略地看了下變數、操作符和控制命令,以後就再也沒有專門找教程看過。你想要實現什麼功能,一般matlab都有相應的內置函數,你可以先google到函數的名字,然後在命令行上用help看函數用法和例子。比如你要求解一個優化問題,你可以很快google到fmincon這個函數,然後讀一下說明你就可以使用。如果用C,你得花上一兩天來研究演算法然後編程,或者花很多時間找庫並研究介面。直覺化,代碼優雅,符號計算,跳我大Mathematica的坑吧!!安利文:我為什麼喜歡Mathematica
matlab是我吃飯的傢伙。用matlab建立模型,驗證演算法,電腦上跑成功了,其他部門的人會負責把演算法移植成c語言,弄到DSP中。與c相比,變數不需要事先定義,隨便轉換變數類型,強大的函數支持(自己編寫函數也很方便),而且與許多軟體可以無縫對接,總之,非常適合做演算法。打個比方,設計師用matlab設計好世界的物理規則,工程師用c語言把這個世界建造出來。
拿 C 和 Matlab 比挺莫名其妙的。因為你裝任何一個 C 編譯器或 IDE 或任何一個和 C 語言有關的軟體的時候,都不會自帶一個強大的 Toolbox 庫。
在使用 Matlab 時,你會節省很多很多各種專業的開源庫的搜索時間和學習時間,而且還不會有多個不同開源庫整合在一起時極其蛋疼的各種數據格式轉換問題。
而且,相對於 C 語言,Matlab 代碼看起來會短小精悍很多。說一個語言優雅,或者是效率高,或者是封裝好,還有你說的「代碼簡潔」。
前兩個是使用層面上的,後者是形式上的。總之就是速度快,可復用,易讀。maltab效率是不如C,但封裝性和簡潔性都遠遠高於C啊,對矩陣的操作更是符合直覺了,不知道哪裡反直覺了。就下面這兩行,還不夠簡潔還不夠符合直覺?你用C去實現試試。I = imread("xxx.jpg");imshow(I);matlab封裝得好,比C易讀一萬倍有餘,debug方便得多,復用性強,比C優雅不知道多少倍了。不過每次看到有人說優雅就覺得這人毛病不淺,你就一個程序員,好好解決問題吧,逼格高不到哪裡去的,我要招人,絕對不招張口閉口就說優雅的人。我要你給我賺錢,給我創造產品,不是要你來裝逼的。我是讀了研才開始用matlab的,以前也是用過C, Java, C#之類的,個人感覺有兩個,首先是易於上手,基本的東西很容易學,幫助文檔又足夠強大,只要懂英文很容易學會,與別的語言比沒那麼多限制,而且真的matlab軟體做得太棒了,各種功能強大集成,界面漂亮容易使用。OK,我絕對是matlab支持者其次,編程的思路是不一樣的,感覺matlab最適合探索式的編程,尤其對於做research來說,簡直是神器,一邊試探一邊寫,不對了看看哪個變數不如預想,再隨時畫個圖出來瞅瞅。另外題主說的矩陣表達,不知是說哪點?不過我相信題主用久了就能體會到它的強大了。PS強烈推薦matlab2013
推薦閱讀:
※破解 Root 許可權用哪個軟體好?
※如何看待360那些危言聳聽的話?
※如何簡單的保證Windows系統安全?
※如何向外行人形象地介紹軟體工程這個專業?