Mathematica 有哪些不如 MATLAB 的地方?

求分條詳細說明,有例子,配圖就更好了。


本人使用MATLAB有5年,Mathematica有2年。對這二者都略知一二。總體來說,各有千秋,誰也代替不了誰,這個帖子問的是Mathematica不如MATLAB的地方,就說一下我已知的好了,並不是說Mathematica不如MATLAB好。如有不爽,可以開貼《MATLAB有哪些Mathematica不如Mathematica的地方》:)

1 Mathematica沒有workspace,查看已定義變數不是太方便。

2 Mathematica的debug功能讓人蛋疼。

3 Mathematica不支持OOP(面向對象編程)。

4 Mathematica是黑箱,用戶無法看到函數代碼,也無法修改代碼,而MATLAB大部分函數是有源代碼的,可以看到代碼,可以修改代碼。

先說這些,不定期更新。


1.自我感覺Mathematica更容易崩潰(可能僅僅是我的個例)

就我最近的兩個月使用最新版本Mathematica和Matlab(Mac OS El Capitan)來說,在難度差不多的複雜計算下Mathematica會有不少崩潰的情況,還有在導出為PDF時,有多矩陣顯示時極其容易崩潰。

而且Mathematica一崩潰除非之前保存了,什麼都沒了,真的是什麼都沒了。

上周改了一行代碼運行後全崩了,什麼都沒了啊!逼得我短時間內重寫了代碼。然後現在設置Mathematica為只要有output就自動保存了,好了很多。(這個功能默認是不開啟的)

Matlab崩潰了都還保存的不錯,迄今沒發生嚴重的情況,而且想了想我Matlab真的似乎就從來不崩潰。

2.涉及矩陣的運算感覺不夠順手。(我不是Mathematica大牛,可能是自身水平所限)

上面也有人提過了Matlab基本完全基於矩陣,自然在這方面有極大優勢。我就舉個簡單的例子,Mathematica中Cross[]命令算兩個list的叉乘挺方便,但是針對矩陣形式的列向量就很憋屈了,逼得我用了一些其他彌補方式達到了這個功能。對應的Matlab中就太簡單了。

如果有知友有好的方法也請告訴我哈,感謝了~

PS:當然這些劣勢不阻擋我在某些場景下一定會強烈傾向於Mathematica


Mathematica里的For循環奇慢無比。

好了好了先別急著踩,我舉這個例子只是想要提醒諸位,這個問題下的某些答案其實有著同樣的問題——不,或許該說是題主在提問時對「不如」二字的界定不清。說得詳細一點就是:「Mathematica在使用某一具體思路處理某一問題時不及MATLAB,但是在Mathematica里其實存在著與這所謂的某一具體思路截然不同的其他思路可以更有效率地處理這個某一問題」的情況,算不算是「Mathematica不如MATLAB」?(你丫說人話!)

說得再具體一點,就是:Mathematica自帶的debug工具是個渣(2016.12.29 我想我恐怕得收回這句話了,理由參看這裡:http://note.youdao.com/share/?id=556026c5dda745eb3b9de92e4dac338btype=note#/),但是它有具備優秀的動態交互能力的筆記本(.nb);Mathematica的正則或許不行(因為我對正則了解很有限,所以容我加上「或許」),但是它有自己的一套基於模式匹配的字元串處理工具。debug工具的問題,正則的問題,諸如此類的問題,真的該算進「不如」里去嗎?

最後,為了避免這個答案徹底跑題,放一個我所見到的疑似Mathematica不如MATLAB的地方吧:

Mathematica內的至少是一部分特殊函數的數值演算法可能不如MATLAB。(加「可能」是因為截止目前我只看到了一些間接證據,但我必須承認可能性不低。)

間接證據:

matlab - Numerical integration"s speed

numerical integration

numerics - How to improve performance of BesselJ to the level of GSL?(此問題和MATLAB無關,但它作為證據是最關鍵的:它表明Mathematica內置的BesselJ數值演算法不夠豐富。大家都知道MATLAB和Mathematica的許多數值演算法背地裡用的都是現成的函數庫,前兩帖裡面的問題本質說不定就是這個。)

————————

@wolray匿名沒法評論只好寫這裡了。

1 必須承認至少在探索性運算時我也時不時地會遇到這個問題,我個人的習慣是吃不準維度的時候就用Dimensions測一下,不過,WorkSpace其實屬於「在Mathematica里沒有但是(起碼在實現一個不太複雜的版本時)實現起來並不困難」的內容,然後,WorkSpace在SE上其實有人寫過,簡單的到複雜的都有:variable definitions。

2 「寄人籬下的列表」這個說法我並不同意,如果說Mathematica的設計者真的是在通過這種輸出方法強調什麼的話,我寧願認為這是在強調「矩陣也只是一種列表」,而列表操作可是Mathematica核心語言關鍵組成部分之一。另,其實關於這個有個非常簡單的調節方法:matrix - Why does MatrixForm affect calculations?。注意這裡$PrePrint的改變隻影響矩陣輸出時的「外觀」,所以不存在MatrixForm影響後續計算的問題。

3 找了個在線版Octave試了一會兒……如果我理解的不錯的話,你的偽代碼的完整版本應該是

a=1;
for i=1:4
a(i+1)=a(i)+1;
end
%執行完後a變為[1 2 3 4 5]

之類,那麼,這一點所談的內容其實很接近Mathematica的AppendTo慢得掉渣——這個也屬於分割線前所談問題的一部分。

4 你需要Flatten以及Flatten的第四種語法或者ArrayFlatten:

$PrePrint = Replace[#, mat_?MatrixQ :&> MatrixForm[mat]] ;
m = {{1, 2}, {3, 4}};
Flatten[{m, m}, 1]
ArrayFlatten[{{m}, {m}}]
Flatten[{m, m}, {{2}, {1, 3}}]
ArrayFlatten[{{m, m}}]

其中ArrayFlatten行為大概直觀一些(還不明白的各位可以觀察一下{{m},{m}}和{{m,m}}的MatrixForm),不過,還是建議諸位去把Flatten的第四種語法弄明白——這種語法相對而言更抽象,但是,會了之後也就這麼回事,而且,如果能比較好地理解這種語法,你對Mathematica核心語言的理解會進一個層次。當然了,Flatten的第四種語法自帶幫助里的解說是簡略了些,關於這個可以參考這裡:誰給我講講Flatten的第四種語法(即ArrayFlatten的第一種語法)_mathematica吧。順便說一句,上述目的用Join也可以實現(這個已經有朋友在其他答案以及評論里提及了),不過,這些方法的效率並不及Flatten和ArrayFlatten。

5 粗體字的部分,依舊屬於此帖分割線前所談的內容。但是作為例子的偽代碼的部分沒看懂,話說我總感覺MATLAB的偽代碼和Mathematica的偽代碼實現的不是同一個目的……

————————

10.28 閱讀 @wolray 的10.28補充後的若干補充

呀咧呀咧,這是準備戰起來了啊,嘛,反正不關我的事(喂!)。總之這裡依舊談一下我所知道的部分。

0 說實話我覺得你在論證MATLAB對矩陣的支持好於Mathematica時舉的例子還是缺乏典型性,沒有戳到痛處,部分同志目前會表現得略顯激動其實很大程度上和這有關——我甚至覺得 @無影東瓜 在評論里提及的「可以少寫幾重括弧」這點都比你已經提及的例子來得有力。然後,如果你將視野從一二維矩陣放寬到高維矩陣,並且事先接觸過簡單的張量知識(在《高等流體力學》《連續介質力學》《固體力學》等課程里都會涉及這個)的話,你將會發現,Mathematica對於高維列表(或者你要叫向量、矩陣之類的都可以)的處理方式,比MATLAB要自然。(這點在上面那個關於Flatten第四種語法的帖子里有稍詳細些的論述,有興趣可以看看。)

0.5 Mathematica在國內國外的使用人數都小於Matlab,這點沒錯(關於這點其實還可以查谷歌趨勢),不過這裡需要指出的是,你的普及度調研的樣本選的還是有問題。不知道你的人數統計用的是帖數還是什麼,但國內方面,百度MATLAB吧現在完全是無政府狀態,而Mathematica吧不但有人管,而且管的還嚴。(剛點進MATLAB吧主題頁面數了一下,第一頁50個主題,如果按Mathematica吧現在的管理標準,保守地說要砍掉30個。)國外樣本里你提到了「官方論壇」,如果你選的是Mathematica官方論壇http://community.wolfram.com的話,那麼,這個選取是不合適的,國外Mathematica討論的中心是http://Mathematica.stackexchange.com。

1 示例代碼漏了一對小括弧。

2 初始化配置文件的正確名字是init.m,它可以通過

SystemOpen@"init.m"

來快速打開,無需自己找路徑。

3 ……你好像沒看清重點, @朱裕德 的這個回答——算了讓他本人來說吧我不插嘴了。

4 「一個簡簡單單的矩陣合併操作,居然可以有這麼多不同的寫法,這難道不是再一次說明MMA對矩陣的支持並不太好,以至於要實現某個基礎功能,還可以找出許多不同的間接途徑(嗎)」,這句真的是完全錯了,Mathematica的設計哲學本來就是「允許用許多種不同方法做同一件事」的。(當然這導致有的時候要找出最有效率的那種會比較麻煩。)應該說,可供選擇的方法多,恰恰說明了Mathematica對某一類問題的支持好。此外純用Join,Flatten,ArrayFlatten的那三種解法,真心不是「間接途徑」,至於有很多人沒有想到Join的第二種語法或者Flatten的第四種語法或者ArrayFlatten這點,我很想說………………這話說出來感覺會得罪很多人所以算了吧。

5 補充一點,循環效率低下這點其實有可能並非是Mathematica設計者有意打壓,關於這個其實我在你鏈的那個問題里也有個回答,不過好像沒有人注意(或許是因為我只貼了個鏈接所以顯得不夠誠意?為了方便閱讀這裡再貼一遍好了:為什麼MMA用FOR循環的效率特別低?_mathematica吧,有興趣的可以看看)。關於Table的使用限制上的問題,我也可以給你補個例子:如果在演算法中涉及無可避免的部分列表操作,Table就會顯得比較無力,相應地,Do的使用就會變得必要,這類演算法中的典型例子是有限差分法(FDM)。(順便說一句,對Do的使用其實並不需要太過極端地避免,它其實很接近一個沒有輸出的Table——當然了,For的使用還是要全力避免的。)不過,如果在編程時涉及此類演算法,那麼效率通常會比較重要,這種時候編程的重點往往會偏向Compile的使用,甚至考慮使用C或Fortran等低級語言去寫——扯遠了,就此打住。


矩陣操作似乎matlab特地進行內存優化過,但是具體性能方面,我也沒有做過測試


我想想……

……

……

……

想不出來。


matlab有一些非常強大的學科專門工具箱(有一些要付費),只有matlab有,別的語言包括mma是沒有的。

順便一提,mma雖然沒有oop,但如果你lisp熟練,實現一個oop也不是很難的事。


Dynare(宏觀經濟學的一個工具包)只能在Matlab和Octave上運行,不支持MMA.


想借這機會問問:到底怎麼單步調試啊?

我是認真的,這個問題應該是典型的會者不難難者不會,我實在是找不到了


1,Simulink/Stateflow

2,UI更友好。workspace不說了,寫個function/script然後F10一行一行看debug效率不知道比Mathematica高到哪去了。

3,雖說MATLAB函數名不優雅,但是矩陣乘得用.而不是*矩陣指數得用MatrixExp而不能用Exp搞得我第一次用Mathematica的時候被最後結果錯誤困擾了接近一個小時。

4,對於普遍第一次接觸的語言是C/Fortran的人來說,MATLAB語法簡單很多。啊?你說你的啟蒙語言是Lisp?。。。


從數值計算的角度來說,mathemtica沒有辦法調用Fortran的庫,想做一個嚴格對角化都不行。。。


推薦閱讀:

自學 MATLAB,有哪些小項目值得推薦?
大家用matlab有遇到過哪些槽點?
如何使用MATLAB畫三維的蘋果?
初學 Matlab 要如何開始?

TAG:MATLAB | WolframMathematica |