小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

論操作體驗(yàn),MATLAB、Julia & Python哪個(gè)更好?

 星光閃亮圖書(shū)館 2019-08-30

我一直質(zhì)疑自己在研究和教學(xué)中是否應(yīng)該繼續(xù)使用 MATLAB。然而,雖然使用起來(lái)得心應(yīng)手,也投入了很多,但我很難調(diào)動(dòng)起學(xué)習(xí)新東西的動(dòng)力。

我和其他人合作寫(xiě)過(guò)一本介紹計(jì)算科學(xué)的 MATLAB 教材。這本書(shū)里有 40 多個(gè)函數(shù)和 160 多個(gè)計(jì)算樣例,它涵蓋了我認(rèn)為在數(shù)值科學(xué)計(jì)算中 MATLAB 的所有基礎(chǔ)使用方法。為了實(shí)現(xiàn)自我提升,并增強(qiáng)該書(shū)的實(shí)用性,今年我開(kāi)始把這些代碼用 Julia 和 Python 實(shí)現(xiàn)。這種實(shí)踐讓我對(duì)三種語(yǔ)言在科學(xué)計(jì)算中的應(yīng)用有了更特別的體會(huì),下面我將進(jìn)行詳細(xì)說(shuō)明。

先不考慮成本和開(kāi)放性問(wèn)題。與 Python 和 Julia 不同,MATLAB 既不是免費(fèi)軟件,也不是開(kāi)源軟件。對(duì)很多人來(lái)說(shuō),這是一個(gè)極大的區(qū)別,甚至是致命性的,但我認(rèn)為這是一個(gè)技術(shù)優(yōu)勢(shì)。多年來(lái),MATLAB 在很多方面發(fā)揮了遠(yuǎn)超過(guò)其它任何免費(fèi)產(chǎn)品的實(shí)用價(jià)值,使用免費(fèi)產(chǎn)品并希望達(dá)到一定成效,成本反而會(huì)很高。這一點(diǎn)對(duì)語(yǔ)言和生態(tài)系統(tǒng)的理想化訴求,需要單獨(dú)進(jìn)行考慮。

如果不考慮成本,可以看到這些語(yǔ)言起源時(shí)的諸多不同之處。MATLAB 最早出現(xiàn)時(shí),側(cè)重于數(shù)學(xué)方面,尤其是在數(shù)值運(yùn)算相關(guān)的數(shù)學(xué)領(lǐng)域。Python 在上世紀(jì)八十年代后期出現(xiàn),關(guān)注計(jì)算科學(xué)。Julia 開(kāi)始于 2009 年,力求在多個(gè)方面實(shí)現(xiàn)平衡。

MATLAB

論操作體驗(yàn),MATLAB、Julia & Python哪個(gè)更好?

最開(kāi)始,MATLAB 里的每個(gè)值都是雙精度浮點(diǎn)數(shù)組,設(shè)計(jì)之初就確定了使用數(shù)組和浮點(diǎn)數(shù)。

浮點(diǎn)數(shù)的 IEEE 754 標(biāo)準(zhǔn)直到 1985 年才被采用,那時(shí)的內(nèi)存是用 K 而不是用 G 來(lái)測(cè)量的。浮點(diǎn)數(shù)的雙精度表示并不是最有效的表示字符或整數(shù)的方法,但是它們是科學(xué)家、工程師以及越來(lái)越多的數(shù)學(xué)家大部分時(shí)間里更愿意使用的格式。此外,不需要聲明變量,也不需要顯式地分配內(nèi)存。讓計(jì)算機(jī)來(lái)處理這些任務(wù),并快速處理數(shù)據(jù)類型,解放你的大腦去思考對(duì)數(shù)據(jù)進(jìn)行操作的算法。

數(shù)組之所以重要,是因?yàn)榫€性代數(shù)中的數(shù)值算法正在以 LINPACK 和 EISPACK 的形式出現(xiàn)。但是,使用科學(xué)計(jì)算的標(biāo)準(zhǔn)載體 FORTRAN 77 來(lái)訪問(wèn)它們是一個(gè)多步驟的過(guò)程,包括聲明變量、調(diào)用名稱神秘的例程、編譯代碼,然后檢查數(shù)據(jù)和輸出文件。把矩陣乘法寫(xiě)成 A*B 的形式,然后馬上把答案打印出來(lái),這是一種對(duì)游戲規(guī)則的改變。

MATLAB 還使圖形變得更簡(jiǎn)單、更容易訪問(wèn)。沒(méi)有使用底層調(diào)用和硬件相關(guān)的庫(kù),只用一個(gè) plot(x,y) 就可以得到想要的圖形。它還有很多創(chuàng)新之處,比如嵌入復(fù)數(shù)、稀疏矩陣、構(gòu)建跨平臺(tái)圖形用戶界面的工具,以及領(lǐng)先的 ODE 求解程序套件,這些都使 MATLAB 在科學(xué)計(jì)算上速度非???。

然而,對(duì)于交互式計(jì)算 (即使是長(zhǎng)時(shí)間的計(jì)算) 來(lái)說(shuō),理想的設(shè)計(jì)并不總是有助于編寫(xiě)高性能軟件。在許多函數(shù)之間移動(dòng)數(shù)據(jù)需要同時(shí)處理許多變量,并經(jīng)常查閱關(guān)于輸入和輸出參數(shù)的文檔。對(duì)于小型項(xiàng)目來(lái)說(shuō),在平面名稱空間中為每個(gè)磁盤(pán)文件提供一個(gè)函數(shù)非常簡(jiǎn)單,但是對(duì)于大型項(xiàng)目來(lái)說(shuō)就比較麻煩了。如果要避免速度瓶頸,必須應(yīng)用某些編程模式 (向量化、內(nèi)存預(yù)分配)??茖W(xué)計(jì)算現(xiàn)在被應(yīng)用到更多領(lǐng)域,擁有大量不同類型的原生數(shù)據(jù)。

MathWorks 對(duì) MATLAB 持續(xù)進(jìn)行了創(chuàng)新:內(nèi)聯(lián)函數(shù)、嵌套函數(shù)、變量閉包、大量的數(shù)據(jù)類型、面向?qū)ο筇匦浴卧獪y(cè)試框架等等。每一個(gè)創(chuàng)新都可能是一個(gè)重要問(wèn)題的解決方案。但 40 年來(lái)這些變化的累積產(chǎn)生了副作用,削弱了概念的簡(jiǎn)單性和統(tǒng)一性。2009 年,我寫(xiě)了一本書(shū),在不到 100 頁(yè)的篇幅里,很好地涵蓋了我認(rèn)為 MATLAB 的基本內(nèi)容。據(jù)我所知,它們現(xiàn)在仍可用。不過(guò)要想精通的話,還需要了解更多。

Python

從某種意義上說(shuō),Python 的歷史似乎是 MATLAB 的一個(gè)鏡像。兩者都具有交互式命令行(現(xiàn)在通常叫做 REPL,即“read-eval-print loop”,交互式解釋器)、可以自由定義變量和編譯。不過(guò) MATLAB 是為數(shù)值分析而開(kāi)發(fā)的,而 Python 的誕生是為了滿足人們內(nèi)心的黑客夢(mèng)。經(jīng)過(guò)改進(jìn)和擴(kuò)展,它們?cè)絹?lái)越趨于同化。

在我看來(lái),Python 仍缺少數(shù)學(xué)上的吸引力。它有一些討厭的小問(wèn)題,如使用 而不是 ^,用 @來(lái)表示矩陣的相乘(最近的改進(jìn)?。?、使用 shape 而不是 size of 來(lái)獲取矩陣的大小、仍使用行數(shù)據(jù)存儲(chǔ)等等。如果認(rèn)為用 V.conj().T@D3@V 可以很好地表達(dá) V?D3VV?D3V,那真的很好笑。Python 里索引從 0 開(kāi)始(與從 1 開(kāi)始的索引相反)。我閱讀過(guò)讀取參數(shù)這篇文章,我認(rèn)為這不是關(guān)鍵因素。很明顯,這只是一個(gè)習(xí)慣問(wèn)題——就像網(wǎng)上圣戰(zhàn)一樣的問(wèn)題——因?yàn)槟阋部梢越o每種命名方式列舉出不好的例子。我覺(jué)得最主要的是,我們?cè)跀?shù)學(xué)實(shí)踐中從 1 開(kāi)始標(biāo)識(shí)向量和矩陣已經(jīng)有數(shù)十年了,大部分的偽代碼都做了這樣的假設(shè)。

除了這些令人討厭的地方之外,我發(fā)現(xiàn) Python+NumPy+SciPy 的生態(tài)系統(tǒng)看起來(lái)凌亂且不一致。盡管編程語(yǔ)言致力于面向?qū)ο螅源嬖诰仃囶?,但它的使用是不被鼓?lì)而且正在逐漸消失的。也許 MATLAB 輕易俘獲了我的心,但是我覺(jué)得矩陣是很重要的對(duì)象類型,應(yīng)該給予保留和改進(jìn)。用 * 可以實(shí)現(xiàn)對(duì)數(shù)組和矩陣不同的計(jì)算,這難道不是面向?qū)ο缶幊蹋∣OP)的一大賣點(diǎn)嗎?從這一點(diǎn)來(lái)看,有很多不合理的地方(為什么我要使用 spsolve 命令?稀疏據(jù)矩陣中,可以只調(diào)用 solve 嗎……)。

這個(gè)生態(tài)系統(tǒng)有些地方看起來(lái)有點(diǎn)薄弱。比如,求積分和解常微分方程在 2019 年看來(lái)是一個(gè)最小的集合。據(jù)我所知,沒(méi)有針對(duì)微分代數(shù)方程(DAE)、延時(shí)微分方程(DDE)、辛求解的方法或是允許內(nèi)部 Krylov 子空間迭代的隱式算法。來(lái)看下這些函數(shù)的相關(guān)參考資料,它們都已經(jīng) 30 年或更久了——仍然很好但遠(yuǎn)不夠完整。Matplotlib 包是個(gè)了不起的成果,暫時(shí)看起來(lái)比 MATLAB 更好,但是它缺乏 3D 支持。

一些專家認(rèn)為,Python 代碼難以跟上編譯語(yǔ)言的執(zhí)行速度有深層次的原因。當(dāng)看到“python 很慢”的搜索結(jié)果時(shí),我覺(jué)得很可笑。Python 的擁護(hù)者提出了很多與 MATLAB 相同的論點(diǎn) / 道歉,并不是說(shuō)他們錯(cuò)了,但這不僅僅是一個(gè)有沒(méi)有遠(yuǎn)見(jiàn)的問(wèn)題。

我想我知道為什么對(duì)于很多從事科學(xué)計(jì)算的人來(lái)說(shuō),Python 如此讓人激動(dòng)。它具有 MATLAB 風(fēng)格的語(yǔ)法和功能,允許 REPL 運(yùn)行環(huán)境;它有強(qiáng)大的工具,和其它語(yǔ)言在計(jì)算領(lǐng)域可以很好地配合使用;它是免費(fèi)的,從長(zhǎng)遠(yuǎn)來(lái)看,有更好的可重復(fù)性。很明顯,它對(duì)很多人有效,沒(méi)有必要進(jìn)行語(yǔ)言的切換。

但對(duì)于我所知道的科學(xué)計(jì)算領(lǐng)域,Python 比我過(guò)去接觸過(guò)的語(yǔ)言在學(xué)習(xí)和使用上更繁瑣。我們還不知道它是會(huì)繼續(xù)席卷整個(gè)社區(qū),還是已經(jīng)接近頂峰。我沒(méi)有特別的預(yù)測(cè)能力,但我更傾向于認(rèn)為它會(huì)呈下跌趨勢(shì)。

Julia

論操作體驗(yàn),MATLAB、Julia & Python哪個(gè)更好?

作為后來(lái)者,Julia 有優(yōu)勢(shì)也有劣勢(shì)。我為 Julia 的創(chuàng)建者鼓掌,因?yàn)槲蚁嘈潘麄兡茏龅酶茫何覀冃枰婚T開(kāi)源的語(yǔ)言,沒(méi)有使用許可限制。我們希望它有 C 的速度,Ruby 的活力。我們需要像 homoiconic 一樣的語(yǔ)言,它像 Lisp 一樣有宏,但是也像 Matlab 一樣有顯而易見(jiàn)、熟悉的數(shù)學(xué)標(biāo)記。我們希望它像 Python 一樣普通適用,像 R 語(yǔ)言一樣適用于統(tǒng)計(jì),像 Perl 一樣適用于字符串處理,像 Matlab 處理線性代數(shù)一樣強(qiáng)大,像 DOS 命令一樣擅長(zhǎng)粘合程序。它簡(jiǎn)單易學(xué),卻讓黑客因其挑戰(zhàn)性而歡欣。我們希望它具有互動(dòng)性且能夠被編譯。

在很大程度上,我相信他們已經(jīng)做到了。在后續(xù)的 1.0 版本上,REPL 的重要性有所下降,有一些和 MATLAB 略有差別的改動(dòng)(LinRange 確實(shí)比 linspace 更好嗎?)。不過(guò)這些都是小事而已。

這是我使用的第一種超越 ASCII 的語(yǔ)言,我對(duì)其感到不可思議的滿意。比如在使用 ?變量和≈操作符時(shí),它不僅僅在表面表現(xiàn)優(yōu)異,雖然需要復(fù)雜的教學(xué)和文檔,但它可以讓代碼更接近我們所寫(xiě)的數(shù)學(xué)表達(dá)式,而這才是真正的優(yōu)勢(shì)。

使用 Julia,我才認(rèn)識(shí)到我保留了很多 MATLAB 的編程習(xí)慣,而不是因?yàn)槠湎忍靸?yōu)勢(shì)。很多時(shí)候,矢量化并不容易。但在 Julia 中,可以給任意函數(shù)名上添加一個(gè)點(diǎn)將其矢量化,這讓人大開(kāi)眼界。Julia 用 comprehension 來(lái)創(chuàng)建一個(gè)矩陣,讓 MATLAB 中的嵌套循環(huán)(或 meshgrid )看起來(lái)有點(diǎn)過(guò)時(shí),這樣就避免通過(guò) generator 來(lái)做簡(jiǎn)單的匯總,免得大材小用(我記得 Python 也有這個(gè)功能)。

相較于面向?qū)ο螅嘀胤峙桑╩ultiple dispatch)讓很多事情變得更簡(jiǎn)單清晰。例如,假設(shè)在傳統(tǒng)的面向?qū)ο笳Z(yǔ)言中,有 Wall 和 Ball 兩個(gè)類,哪個(gè)類可以檢測(cè)到 Ball 碰到了 Wall 呢?是否需要一個(gè) Room 類來(lái)做裁判呢?這類問(wèn)題讓我很困擾。而通過(guò)多重分派,數(shù)據(jù)和對(duì)象類型綁定在一起,但是操作數(shù)據(jù)的方法不需要和類綁定。因此,知道類的類型,但它是獨(dú)立定義的。我編程很久才意識(shí)到,多重分派的有趣和理解多重分派在語(yǔ)言擴(kuò)展上的重要性。

function detect_collision(B::Ball,W::Wall)

數(shù)字生態(tài)系統(tǒng)演進(jìn)速度非常快。第一個(gè)例子是 DifferentialEquations.jl,由 Chris Rackauckas 編寫(xiě)。如果不盡快給這個(gè)軟件頒發(fā)威爾金森獎(jiǎng),那真是太不應(yīng)該了。

我還想看到 Julia 所承諾的基于 MATLAB 所做的速度提升。部分是因?yàn)槲蚁鄬?duì)經(jīng)驗(yàn)不足和我所承擔(dān)任務(wù)需求,也因?yàn)?MathWorks 在自動(dòng)化代碼優(yōu)化方面做了很出色的工作。在大部分時(shí)間里,我所關(guān)注的不是編程方面的問(wèn)題。

用 Julia 編程讓我花了一段時(shí)間才適應(yīng) (或許因?yàn)槲议_(kāi)始變老了,思想固化了)。它讓我對(duì)數(shù)據(jù)類型的思考超出了我的想象,我還總覺(jué)得自己沒(méi)有按正確方式去做事。但對(duì)于日常使用,我現(xiàn)在更傾向于使用 Julia,而不是 MATLAB。

總結(jié)

MATLAB 是一個(gè)企業(yè)級(jí)解決方案,尤其對(duì)于工程而言。對(duì)于基本數(shù)值任務(wù)來(lái)說(shuō),它是最容易學(xué)習(xí)的。詳盡的文檔和多年積累的學(xué)習(xí)工具也相當(dāng)重要。

MATLAB 是科學(xué)計(jì)算領(lǐng)域中的寶馬轎車。它很昂貴,還不包括附件(工具箱)。你需要為其堅(jiān)固的車體、平穩(wěn)的性能和服務(wù)而買單。但它也會(huì)帶來(lái)與其價(jià)值不匹配的困擾。

Python 是福特皮卡。他在很多地方(美國(guó))廣受歡迎。它可以做你希望的任何事,也可以做到其他汽車所不能做到的。你可能時(shí)而想要借用一下,但它提供不了純粹的駕駛體驗(yàn)。

Julia 是特斯拉。它的創(chuàng)造有一個(gè)大膽的目標(biāo),那就是改變未來(lái)。它也可能只是一個(gè)腳注,但與此同時(shí),你會(huì)很舒服地到達(dá)你要去的地方,并且電量會(huì)有盈余。

如果大家有什么JAVA學(xué)習(xí)問(wèn)題的可以隨時(shí)找我交流,或者私信我獲取JAVA系統(tǒng)學(xué)習(xí)資料!

本文轉(zhuǎn)載至——AI前線。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多