校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Linux折騰記(十七):適合數(shù)值計算的語言需要具備什么樣的特色

Linux折騰記(十七):適合數(shù)值計算的語言需要具備什么樣的特色

熱門標(biāo)簽:河北語音電銷機器人 地球地圖標(biāo)注方法 河南智能電話機器人公司 商戶地圖標(biāo)注 電話機器人哪里有賣的 壽光百度地圖標(biāo)注中心網(wǎng)站 樺甸電銷機器人 新鄭電銷外呼系統(tǒng)線路 怎樣給景區(qū)加百度地圖標(biāo)注

  2015年1月,我繼續(xù)徜徉在數(shù)值計算的世界。這段時間里,我抽空看了Python科學(xué)計算和數(shù)值分析方面的書,也仔細研讀了Octave的用戶手冊,甚至連古老的Fortran、新興的R語言我都去逐一了解。對于數(shù)值計算的庫,我了解了一下Boost的uBLAS,以前也用過OpenCV,當(dāng)然,了解最多的還是Python中的NumPy、SciPy和pandas。

  前幾篇隨筆搞了不少工具論,所以今天我就專門來論一論編程語言。我的這個Linux江湖系列是一會兒方法論一會兒工具論,每過一段時間也談?wù)劸幊陶Z言。今天談的內(nèi)容是我對適合做數(shù)值計算的編程語言的一些看法,主要是一些思路方面的東西,不評論具體語言的優(yōu)劣。另外,我是想到哪兒寫到哪兒,如果有什么不對的地方歡迎大家指正。

一、元組和數(shù)組

  如果數(shù)值計算僅僅只是兩個標(biāo)量之間的加減乘除,那就不需要我在這里浪費口舌了。向量啊、矩陣啊、多維數(shù)組啊什么,才是數(shù)值計算真正的主角。所以,適合做數(shù)值計算的編程語言必須有一個好的方式表示數(shù)組,特別是多維數(shù)組。哪種方式好呢?是這樣:


復(fù)制代碼
代碼如下:

int a[m][n][k];

還是這樣:


復(fù)制代碼
代碼如下:

int a[m,n,k];

  看似沒有什么差別,但是如果你想獲取數(shù)組a的形狀呢?比如這樣:


復(fù)制代碼
代碼如下:

? = a.shape();

或者再更進一步,想改變數(shù)組a的形狀呢?比如這樣:


復(fù)制代碼
代碼如下:

a.reshape(?);

  在上面的代碼中,“?”究竟應(yīng)該用什么代替呢?

  如果讓我給出答案,我會說:要用元組。很多編程語言中都有元組的概念,比如Python。元組就是用逗號隔開的幾個值,可以加圓括號,也可以不加。我覺得加上圓括號后可讀性更好。比如(a,b)是元組,(3,4,5)也是元組。如果寫成[3,4,5]那就是數(shù)組了,在Python中,也稱之為列表。不過Python的列表功能比數(shù)組要強大,因為數(shù)組只能保存同一種數(shù)據(jù)類型的值,而列表可以保存任何對象。數(shù)組一般情況下不能動態(tài)改變長度,而列表可以。Octave語言中使用cell array這個術(shù)語來表示可以保存不同類型對象的容器。Octave中的數(shù)組和矩陣是可以動態(tài)改變長度的。C語言的數(shù)組沒有動態(tài)改變長度這個功能,而如果使用C++的話,則必須使用vector>模板類。

  我認(rèn)為,一個好的編程語言必須要有“元組”這個一個概念,必須能夠用好大括號、中括號和小括號。在有沒有元組這個問題上,很多語言做得不好,C語言沒有,C++也沒有,Java沒有,C#這個有很多新功能的語言也沒有,不要告訴我有Tuple>模板類可以用,那個真的沒有語言內(nèi)置的元組功能好。在能不能用好大中小括號這個問題上,C語言就做得不好。你看它不管是初始化數(shù)組,還是初始化struct,都是用大括號。而Python和JSON就做得很好嘛,初始化數(shù)組用中括號,初始化對象或字典的時候采用大括號。如果加上小括號表示元組,那就齊活兒了。

  數(shù)值計算可以針對標(biāo)量、一維數(shù)組、二維數(shù)組以及n維數(shù)組進行。數(shù)組可以如下組織,如下圖:

  元組最大的用途就是可以用來表示數(shù)組的形狀了。比如一維數(shù)組的形狀為(n,),請注意其中的逗號不能省略。二維數(shù)組的形狀(m,n),三維數(shù)組的形狀(m,n,k),依次類推。另外,元組可以用來對數(shù)組中的元素進行索引。比如:


復(fù)制代碼
代碼如下:

a = [ [1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16] ];b = a[2,3,3];

  元組還有一個很大的用途,那就是可以讓一個函數(shù)返回多個值。C語言在這個方面是做得比較丑陋的,如果一個函數(shù)要返回多個值,只能給這個函數(shù)傳指針或者多重指針作為參數(shù),C++可以傳引用,C#更加畫蛇添足,專門有一個out關(guān)鍵字用來修飾函數(shù)的參數(shù)。微軟你真是的,你既然能想到out,你就不能想到元組嗎?常見的例子,比如meshgrid()函數(shù)可以同時初始化兩個數(shù)組,peak()函數(shù)可以同時初始化三個數(shù)組。你看它們用元組多方便:


復(fù)制代碼
代碼如下:

(xx, yy) = meshgrid(x, y);(xx, yy, zz) = peak();

   另外,元組還可以這樣用,比如交換兩個變量的值:


復(fù)制代碼
代碼如下:

(a,b) = (b,a);

二、數(shù)組初始化

  在數(shù)值計算中,數(shù)組的初始化也是非常重要的一環(huán)。如果像C語言這樣寫:


復(fù)制代碼
代碼如下:

int a[100] = {1, 2, 3, 4, ... , 100};

估計很多人是要罵娘的。這樣寫:


復(fù)制代碼
代碼如下:

for(int i=0; i100; i++){ a[i] = i+1;}

也不優(yōu)雅。我只是想初始化一個數(shù)組而已,怎么就非得要寫一個循環(huán)呢?如果是二維數(shù)組呢,就得兩層循環(huán),三維數(shù)組就得三層。真的是太鬧心了。

  另外,如前所述,我也不喜歡在初始化數(shù)組的時候用大括號。我覺得中括號就是為數(shù)組而生。比如這樣:


復(fù)制代碼
代碼如下:

a = [1, 2, 3, 4];

這就是一個一維數(shù)組,但是如果這樣寫:


復(fù)制代碼
代碼如下:

a = [ [1, 2, 3, 4] ];

就是一個行向量。如果寫成這樣:


復(fù)制代碼
代碼如下:

a = [ [1], [2], [3], [4] ];

那么這就是一個列向量,如下圖:

   當(dāng)然,上面的示例只有四個數(shù)字,這么寫一寫無可厚非。如果是很多數(shù)字呢?或者很多維的數(shù)組呢?這時就必須得用到很多初始化函數(shù)了,而且這些初始化函數(shù)最好能接受元組作為參數(shù)來決定數(shù)組的形狀。比如這樣:


復(fù)制代碼
代碼如下:

a = xrange( 1, 60, (3,4,5) ); //用1到60的數(shù)字初始化一個3*4*5的數(shù)組
b = randn ( (3, 4, 5) ); //用隨機數(shù)初始化一個3*4*5的數(shù)組

  其它的初始化函數(shù)還有l(wèi)inspace()、logspace()、ones()、zeros()、eyes()等等。這些函數(shù)還可以配合reshape()使用,比如這樣:


復(fù)制代碼
代碼如下:

c = linspace(0, 2*pi, 60).reshape(3, 4, 5);

  在所有的這些初始化中,元組都是重要的組成部分。

三、range和切片

  其實,range除了可以是一個函數(shù),還可以更省點兒事,像這樣寫:


復(fù)制代碼
代碼如下:

r = 0:10:2; //0,2,4,6,8,10
s = 11:0:-3; //11,8,5,2

  在某些語言中,也把這個功能叫切片。其實就是“:”的靈活運用,有標(biāo)點符號可以用當(dāng)然不能浪費嘛。使用切片,只需要指定起始值、終止值和步長,就可以獲得一個數(shù)字序列。

  但是,“:”最大的用途并不是用來對數(shù)組進行初始化,而是對數(shù)組進行索引。比如,a是一個三維數(shù)組,可以通過切片來獲取其中的一部分?jǐn)?shù)據(jù)。見下面的代碼:


復(fù)制代碼
代碼如下:

a = range(1, 60).reshape(3, 4, 5); // a是一個三維數(shù)組
b = a[1, 2:3, 1:4]; // b是一個二維數(shù)組,其值為[ [12, 13, 14, 15], [17, 18, 19, 20]]

  切片除了可以指定起始值和終止值外,也可以指定步長。當(dāng)然,也可以只用一個單獨的“:”,代表取這一整個軸。關(guān)于軸的概念,可以看我前面的圖片。見下面這樣的代碼:


復(fù)制代碼
代碼如下:

a = range(1, 60).reshape(3, 4, 5); // a是一個三維數(shù)組
b = a[1, :, :]; // b的值為二維數(shù)組[[1,2,3,4,5], [6,7,8,9,10], [11,12, 13, 14, 15], [16,17, 18, 19, 20]]

四、不寫循環(huán)

  在對多維數(shù)組進行加減乘除的時候,如果使用傳統(tǒng)的像C這樣的語言,則避免不了要寫循環(huán)。比如要計算兩個多維數(shù)組的加法,不得不寫這樣的代碼:


復(fù)制代碼
代碼如下:

m = 10;
n = 20;
k = 30;
a = randn(m, n, k); //形狀為(m, n, k)的三維數(shù)組,初始化為隨機值
b = randn(m, n, k); //形狀為(m, n, k)的三維數(shù)組,初始化為隨機值
for(int i=0; im; i++){
for(int j=0; jn; j++){
for(int p=0; pk; p++){
c[i, j, p] = a[i, j, p] + b[i, j, p];
}
}
}

  上面的代碼當(dāng)然遠不如下面這樣的代碼簡潔:


復(fù)制代碼
代碼如下:

C = A + B;

  所以不寫循環(huán)基本上就成了所有數(shù)值計算語言的標(biāo)準(zhǔn)配置。Matlab和Octave是這樣,NumPy是這樣,R語言也是這樣。C++也在追求這樣,因為C++中有運算符重載的功能,所以可以對矩陣類重載加減乘除運算符。但是C++中運算符的基礎(chǔ)設(shè)施有缺陷,比如它沒有乘方運算符(冪運算符),在Octave和NumPy中,都可以這樣計算$x^y$:x**y。但是在C++中,只有使用函數(shù)power(x, y)。不要想^運算符,它是一個位運算符,所以取冪只有使用**了。另外,多維數(shù)組運算還有特例,比如二維數(shù)組之間加減乘除,既可以是逐元素的加減乘除,也可以是矩陣的加減乘除。向量計算也有特例,既可以是逐元素加減乘除,也可能是向量內(nèi)積(點乘)。如果正好是長度為3的向量,還可以計算叉乘。這些運算符都需要重新定義,所以雖然C++有重載運算符的機制,但是因為這些運算符完全超越了C++的基礎(chǔ)設(shè)施,所以C++也沒有辦法寫得很優(yōu)雅。

  不寫循環(huán)還有一個優(yōu)點,那就是可以對運算速度進行優(yōu)化。優(yōu)化是編譯器或解釋器的責(zé)任,寫數(shù)值計算程序的人可以完全不用費心。編譯器或解釋器可采取的優(yōu)化方式有可能是利用SSE等多媒體指令集,也可能是發(fā)揮多核CPU的多線程優(yōu)勢,甚至是使用GPGPU計算都有可能。如果用戶非要寫成C語言那樣的循環(huán),而他又不會內(nèi)聯(lián)匯編或OpenMP的話,那么就談不上什么運算速度的優(yōu)化了。

五、廣播

  不寫循環(huán),直接把兩個多維數(shù)組進行加減乘除當(dāng)然省事。但是如果兩個數(shù)組的形狀不一樣呢?比如一個二維數(shù)組加一個行向量,或一個二維數(shù)組加一個列向量,甚至是數(shù)組加減乘除一個標(biāo)量,會出現(xiàn)什么情況呢?

  不用擔(dān)心,在面向數(shù)值計算的語言中,一般都有“廣播”這樣一個特性。當(dāng)兩個數(shù)組的形狀不一樣時,形狀比較小的那個往往可以在長度為1的維度上進行廣播。如下圖:

六、奇異索引

  Fancy indexing,有的書上翻譯成花式索引,但我認(rèn)為叫奇異索引比較好。它就是指一個低維的數(shù)組,可以使用高維的數(shù)組進行索引,最后得到的結(jié)果是一個高維的數(shù)組。如果索引中含有切片,可能會得到一個更高維度的數(shù)組作為結(jié)果。

  這個概念理解起來比較難。特別是再配合切片使用,更加增加其復(fù)雜性。所謂一圖勝千言,先看普通索引的情況:

   前面提到,對多維數(shù)組進行索引的時候需要用到元組,元組的長度等同于數(shù)組的維數(shù)。對于普通索引而言,元組的各個部分要么是整數(shù),要么是切片。而對于奇異索引而言,索引元組的各個組成部分都可能是多維數(shù)組或者切片。如果是多維數(shù)組,則最后得到的數(shù)組的形狀和索引數(shù)組的形狀相同,如果配合切片,則可能得到更高維的數(shù)組。如下圖:

七、函數(shù)調(diào)用

  編程語言發(fā)展這么多年,一直在進化,也一直在相互靠攏。對于一個編程語言來說,是應(yīng)該面向過程還是面向?qū)ο螅渴庆o態(tài)類型還是動態(tài)類型?這些都是值得思考的地方。但是在函數(shù)調(diào)用方面,有一些思想倒是可以學(xué)習(xí)。

  在C語言這樣比較古老的語言中,對于函數(shù)的參數(shù)來說,只有位置參數(shù)一種。也就是說,像一個函數(shù)傳遞參數(shù)的時候,只能正確的參數(shù)放到正確的位置,而且參數(shù)的個數(shù)必須和函數(shù)定義的相同。這是最原始的函數(shù)調(diào)用思想。

  緊接著,在某些編程語言如Java、C#中,有了可選參數(shù)這個概念。但是可選參數(shù)要放到參數(shù)列表的最后面,而且必須提供默認(rèn)值。當(dāng)調(diào)用函數(shù)時如果指定了這個參數(shù),則使用調(diào)用時指定的值,否則使用默認(rèn)值。

  但是我覺得適合數(shù)值計算的語言必須還得更進一步,提供關(guān)鍵字參數(shù)的功能。什么是關(guān)鍵字參數(shù)呢?比如對數(shù)據(jù)進行繪圖的時候,需要指定線型、標(biāo)簽、標(biāo)題等各種屬性,可以這樣調(diào)用函數(shù):


復(fù)制代碼
代碼如下:

plot(x, y, marker="*", color="r", linestyle="-", title="...", legend="...", xlabel="...", ylabel="...");

  每一個參數(shù)調(diào)用的時候都可以指定它的名字,這樣我們就不用去死記各個參數(shù)的位置,是不是很方便呢?

八、生態(tài)環(huán)境

  對于一門編程語言而言,生態(tài)壞境很重要。在數(shù)值計算領(lǐng)域更是如此。因為很多數(shù)值計算的庫都是專業(yè)的人士寫給專業(yè)人士看的,比如物理專業(yè)的寫物理領(lǐng)域的算法,氣象專業(yè)的寫氣象專業(yè)的算法,所以不大可能有一個全面的官方的,像C或C++這樣一個由ANSI定義的庫。

  廣泛接受開源社區(qū)的貢獻是一個比較好的辦法。Perl是這樣,Python也是這樣,新興的R語言也是這樣。Perl有CPAN,Python有PyPI,R語言也有CRAN。至于Matlab,那更是有各種各樣的工具包。

  OK,就寫這么多吧,還有其它的一些什么特色,我想到后再隨時更新此文。

  另外,本文中所有的圖片都是在Ubuntu中使用Inkscape矢量圖軟件繪制而成。

標(biāo)簽:荊州 遼陽 來賓 楚雄 忻州 淄博 迪慶 阜陽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux折騰記(十七):適合數(shù)值計算的語言需要具備什么樣的特色》,本文關(guān)鍵詞  Linux,折騰,記,十七,適合,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Linux折騰記(十七):適合數(shù)值計算的語言需要具備什么樣的特色》相關(guān)的同類信息!
  • 本頁收集關(guān)于Linux折騰記(十七):適合數(shù)值計算的語言需要具備什么樣的特色的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    欧美xxxx老人做受| 亚洲天堂av老司机| 欧美成人精品二区三区99精品| 91蝌蚪porny| 91久久精品一区二区| 欧美亚洲综合色| 日韩精品一区二区三区中文精品| 精品奇米国产一区二区三区| 久久久不卡网国产精品二区| 综合亚洲深深色噜噜狠狠网站| 亚洲综合一二三区| 国内一区二区在线| 91在线一区二区| 日韩欧美资源站| 亚洲一区在线视频| 国产超碰在线一区| 91麻豆精品国产91久久久| 国产欧美一区视频| 亚洲成国产人片在线观看| 久久91精品久久久久久秒播| 97aⅴ精品视频一二三区| 日本高清视频一区二区| 久久综合久久综合亚洲| 亚洲黄色小视频| 丁香婷婷综合网| 日本韩国欧美三级| 亚洲天堂免费在线观看视频| 国产老女人精品毛片久久| 9191成人精品久久| 亚洲一区二区三区在线播放| 国产精品一卡二| 中文字幕免费一区| 91在线你懂得| 一个色在线综合| 在线亚洲免费视频| 午夜视黄欧洲亚洲| 欧美一区二区三区婷婷月色| 亚洲福利视频一区二区| 欧美日韩视频在线观看一区二区三区| 亚洲国产高清aⅴ视频| 丁香网亚洲国际| 亚洲少妇最新在线视频| 色94色欧美sute亚洲13| 亚洲另类春色国产| 欧美日韩国产一区| 极品尤物av久久免费看| 国产精品国产三级国产有无不卡 | 亚洲精品一区二区三区香蕉| 国产成人av影院| 中文字幕中文字幕在线一区 | 精久久久久久久久久久| 精品区一区二区| 风流少妇一区二区| 伊人开心综合网| 久久久精品人体av艺术| 色老汉一区二区三区| 久久国产精品99久久人人澡| 国产精品另类一区| 欧美一区二区网站| 欧美曰成人黄网| 91麻豆国产精品久久| 国产伦精品一区二区三区免费| 自拍偷拍欧美精品| 欧美国产精品一区二区三区| 欧美另类久久久品| 欧美无砖砖区免费| 91免费国产在线观看| 福利一区二区在线| 国产精品亚洲а∨天堂免在线| 午夜亚洲国产au精品一区二区| 国产欧美一区二区三区网站| 欧美精品日韩一区| 欧美男男青年gay1069videost | 国产原创一区二区| 久久精品国产一区二区三区免费看| 一区二区三区波多野结衣在线观看| 久久精品一二三| 精品成人a区在线观看| 久久久久久麻豆| 国产精品美女久久久久久久久| 日韩一区二区三区观看| 色综合欧美在线视频区| 在线区一区二视频| 欧美精品在欧美一区二区少妇| 欧美亚州韩日在线看免费版国语版| 91在线视频免费观看| 欧美日韩专区在线| 日韩女优av电影| 亚洲人妖av一区二区| 日韩电影在线免费看| 国产精品一区二区你懂的| 91在线国产观看| 久久免费看少妇高潮| 国产精品乱人伦一区二区| 亚洲国产日韩a在线播放| 免费欧美日韩国产三级电影| 国产综合色视频| 欧美亚男人的天堂| 国产精品热久久久久夜色精品三区 | 中文字幕亚洲区| 亚洲成人一区二区| 菠萝蜜视频在线观看一区| 日韩欧美一区在线观看| 亚洲卡通动漫在线| 成人丝袜18视频在线观看| 欧美精品视频www在线观看| 久久久亚洲午夜电影| 丝袜国产日韩另类美女| 在线亚洲高清视频| 亚洲激情男女视频| 91浏览器在线视频| 一区二区三区在线看| 成人免费高清视频在线观看| 久久理论电影网| 国产一区二区三区免费观看| 日韩你懂的在线播放| 奇米一区二区三区av| 91视频91自| 国产精品理伦片| 色先锋资源久久综合| 一区二区三区在线观看网站| 成人激情小说网站| 亚洲精品大片www| 欧美疯狂性受xxxxx喷水图片| 亚洲妇熟xx妇色黄| 日韩欧美国产精品| 国产精品18久久久久久久久| 欧美国产一区在线| 99精品视频一区| 午夜欧美2019年伦理| 91精品久久久久久久91蜜桃 | 偷窥少妇高潮呻吟av久久免费| 欧美日韩成人综合在线一区二区| 日韩不卡一区二区| 国产精品免费丝袜| 欧美理论片在线| 国产福利不卡视频| 亚洲影视在线播放| 欧美日本在线视频| 欧洲国内综合视频| 成av人片一区二区| 奇米色777欧美一区二区| 国产女人水真多18毛片18精品视频| 日本高清免费不卡视频| 国产一区 二区 三区一级| 一区二区三区电影在线播| 精品久久一区二区三区| 色94色欧美sute亚洲13| 国产一区二区三区黄视频| 午夜精品一区二区三区三上悠亚 | 制服丝袜在线91| 91在线一区二区| 国产成人av电影| 国产乱理伦片在线观看夜一区| 午夜精品福利一区二区三区av | 国产欧美精品区一区二区三区| 在线观看亚洲a| 色欧美片视频在线观看在线视频| 国产在线不卡一区| 国产精品一区在线观看你懂的| 理论电影国产精品| 国内外成人在线| 韩国视频一区二区| 国产麻豆9l精品三级站| 国产精品1024| 丰满放荡岳乱妇91ww| 成人午夜电影小说| 色婷婷综合久久久| 欧美天堂亚洲电影院在线播放| 欧美亚洲国产一区在线观看网站| 色狠狠桃花综合| 3d动漫精品啪啪一区二区竹菊| 91精品国产综合久久久久久漫画| 欧美区视频在线观看| 精品国产第一区二区三区观看体验 | 日韩一区二区三区在线视频| 日韩一区二区麻豆国产| 国产色产综合产在线视频| 一区二区三区在线看| 精品在线免费观看| 一本久久综合亚洲鲁鲁五月天 | 欧美一区二区三级| 中文字幕高清一区| 日本va欧美va瓶| 北条麻妃国产九九精品视频| 欧美无砖砖区免费| 欧美韩日一区二区三区| 国产精品理论在线观看| 亚洲欧美色图小说| 国产九色sp调教91| 日韩成人一级片| 亚洲精品自拍动漫在线| 99久久婷婷国产| gogo大胆日本视频一区| 欧美一区二区播放| 亚洲中国最大av网站| 91丨九色丨国产丨porny| 久久久久久综合| 国产99久久久久| 国产欧美1区2区3区|