Julia 與其他語(yǔ)言的區(qū)別

2018-08-12 21:26 更新

與其它語(yǔ)言的區(qū)別

與 MATLAB 的區(qū)別

Julia 的語(yǔ)法和 MATLAB 很像。但 Julia 不是簡(jiǎn)單地復(fù)制 MATLAB ,它們有很多句法和功能上的區(qū)別。以下是一些值得注意的區(qū)別:

  • 數(shù)組用方括號(hào)來(lái)索引, A[i,j]
  • 數(shù)組是用引用來(lái)賦值的。在 A=B 之后,對(duì) B 賦值也會(huì)修改 A
  • 使用引用來(lái)傳遞和賦值。如果一個(gè)函數(shù)修改了數(shù)組,調(diào)用函數(shù)會(huì)發(fā)現(xiàn)值也變了
  • Matlab 把賦值和分配內(nèi)存合并成了一個(gè)語(yǔ)句。比如: a(4) = 3.2 會(huì)創(chuàng)建一個(gè)數(shù)組 a = [0 0 0 3.2] ,即為a分配了內(nèi)存并且將每個(gè)元素初始化為0,然后為第四個(gè)元素賦值3.2,而 a(5) = 7 會(huì)為數(shù)組a增加長(zhǎng)度,并且給第五個(gè)元素賦值7。 Julia 把賦值和分配內(nèi)存分開(kāi)了: 如果 a 長(zhǎng)度為4, a[5] = 7 會(huì)拋出一個(gè)錯(cuò)誤。 Julia 有一個(gè)專用的 push! 函數(shù)來(lái)向 Vectors 里增加元素。并且遠(yuǎn)比Matlab的 a(end+1) = val 來(lái)的高效。
  • 虛數(shù)單位 sqrt(-1)im 來(lái)表示
  • 字面上的數(shù)字如果沒(méi)有小數(shù)點(diǎn),則會(huì)被默認(rèn)為整數(shù)類型而不是浮點(diǎn)類型。且支持任意長(zhǎng)度的整數(shù)類型。但是這也意味著一些如2^-1的表達(dá)式因?yàn)椴皇钦蕉鴴伋鲆粋€(gè)異常。
  • Julia 有一維數(shù)組。列向量的長(zhǎng)度為 N ,而不是 Nx1 。例如, rand(N) 生成的是一維數(shù)組
  • 使用語(yǔ)法 [x,y,z] 來(lái)連接標(biāo)量或數(shù)組,連接發(fā)生在第一維度(“垂直”)上。對(duì)于第二維度(“水平”)上的連接,需要使用空格,如 [x y z] 。 要想構(gòu)造塊矩陣,盡量使用語(yǔ)法 [a b; c d]
  • a:ba:b:c 中的冒號(hào),用來(lái)構(gòu)造 Range 對(duì)象。使用 linspace 構(gòu)造一個(gè)滿向量,或者通過(guò)使用方括號(hào)來(lái)“連接”范圍,如 [a:b]
  • 函數(shù)返回須使用 return 關(guān)鍵字,而不是把它們列在函數(shù)定義中
  • 一個(gè)文件可以包含多個(gè)函數(shù),文件被載入時(shí),所有的函數(shù)定義都是外部可見(jiàn)的
  • sum, prod, max 等約簡(jiǎn)操作,如果被調(diào)用時(shí)參數(shù)只有一個(gè),作用域是數(shù)組的所有元素,如 sum(A)
  • sort 等函數(shù),默認(rèn)按列方向操作。( sort(A) 等價(jià)于 sort(A,1) )。要想排序 1xN 的矩陣,使用 sort(A,2)
  • 如果 A 是 2 維數(shù)組, fft(A) 計(jì)算的是 2 維 FFT. 尤其注意的是, 它不等效于 fft(A,1), 后者計(jì)算的是按列的 1 維 FFT.
  • 即使是無(wú)參數(shù)的函數(shù),也要使用圓括號(hào),如 tic()toc()
  • 表達(dá)式結(jié)尾不要使用分號(hào)。表達(dá)式的結(jié)果不會(huì)自動(dòng)顯示(除非在交互式提示符下)。 println 函數(shù)可以用來(lái)打印值并換行
  • AB 是數(shù)組, A == B 并不返回布爾值數(shù)組。應(yīng)該使用 A .== B 。其它布爾值運(yùn)算符可以類比, <, >, !=
  • 符號(hào) & 、|$ 表示位運(yùn)算“和”、“或”以及“異或”。它們和python中的位運(yùn)算符有著相同的運(yùn)算符優(yōu)先級(jí),和c語(yǔ)言中的位運(yùn)算符優(yōu)先級(jí)并不一樣。 它們能被應(yīng)用在標(biāo)量上或者應(yīng)用在兩個(gè)數(shù)組間(對(duì)每個(gè)相同位置的元素分別進(jìn)行邏輯運(yùn)算,返回一個(gè)由結(jié)果組成的新數(shù)組)。 值得注意的是它們的運(yùn)算符優(yōu)先級(jí),別忘了括號(hào): 如果想要判斷變量 A 是等于1還是2, 要這樣寫 (A .== 1) | (A .== 2) 。
  • 可以用 ... 把集合中的元素作為參數(shù)傳遞給函數(shù),如 xs=[1,2]; f(xs...)
  • Julia 中 svd 返回的奇異值是向量而不是完整的對(duì)角矩陣
  • Julia 中 ... 不用來(lái)將一行代碼拆成多行。Instead, incomplete expressions automatically continue onto the next line.
  • 變量 ans 是交互式會(huì)話中執(zhí)行的最后一條表達(dá)式的值;以其它方式執(zhí)行的表達(dá)式的值,不會(huì)賦值給它
  • Julia 的 type 類型和Matlab中的 classes 非常接近。Matlab 中的 structs 行為介于 Julia 的 types 和 Dicts 之間。如果你想添加一個(gè)域在 strut 中,使用 Dict 會(huì)比 type 好一些。

與 R 的區(qū)別

Julia 也想成為數(shù)據(jù)分析和統(tǒng)計(jì)編程的高效語(yǔ)言。與 R 的區(qū)別:

  • 使用 = 賦值,不提供 <-<<- 等箭頭式運(yùn)算符
  • 用方括號(hào)構(gòu)造向量。Julia 中 [1, 2, 3] 等價(jià)于 R 中的 c(1, 2, 3)
  • Julia 的矩陣運(yùn)算比 R 更接近傳統(tǒng)數(shù)學(xué)語(yǔ)言。如果 AB 是矩陣,那么矩陣乘法在 Julia 中為 A * B , R 中為 A %*% B 。在 R 中,第一個(gè)語(yǔ)句表示的是逐元素的 Hadamard 乘法。要進(jìn)行逐元素點(diǎn)乘,Julia 中為 A .* B
  • 使用 ' 運(yùn)算符做矩陣轉(zhuǎn)置。 Julia 中 A' 等價(jià)于 R 中 t(A)
  • if 語(yǔ)句或 for 循環(huán)時(shí)不需要寫圓括號(hào):應(yīng)寫 for i in [1, 2, 3] 而不是 for (i in c(1, 2, 3)) ;應(yīng)寫 if i == 1 而不是 if (i == 1)
  • 01 不是布爾值。不能寫 if (1) ,因?yàn)?if 語(yǔ)句僅接受布爾值作為參數(shù)。應(yīng)寫成 if true
  • 不提供 nrowncol 。應(yīng)該使用 size(M, 1) 替代 nrow(M) ;使用 size(M, 2) 替代 ncol(M)
  • Julia 的 SVD 默認(rèn)為非 thinned ,與 R 不同。要得到與 R 一樣的結(jié)果,應(yīng)該對(duì)矩陣 X 調(diào)用 svd(X, true)
  • Julia 區(qū)分標(biāo)量、向量和矩陣。在 R 中, 1c(1) 是一樣的。在 Julia 中,它們完全不同。例如若 xy 為向量,則 x' * y 是一個(gè)單元素向量,而不是標(biāo)量。要得到標(biāo)量,應(yīng)使用 dot(x, y)
  • Julia 中的 diag()diagm() 與 R 中的不同
  • Julia 不能在賦值語(yǔ)句左側(cè)調(diào)用函數(shù):不能寫 diag(M) = ones(n)
  • Julia 不贊成把 main 命名空間塞滿函數(shù)。大多數(shù)統(tǒng)計(jì)學(xué)函數(shù)可以在 擴(kuò)展包中找到,比如 DataFrames 和 Distributions 包:

  • Julia 提供了多元組和哈希表,但不提供 R 的列表。當(dāng)返回多項(xiàng)時(shí),應(yīng)該使用多元組:不要使用 list(a = 1, b = 2) ,應(yīng)該使用 (1, 2)
  • 鼓勵(lì)自定義類型。Julia 的類型比 R 中的 S3 或 S4 對(duì)象簡(jiǎn)單。Julia 的重載系統(tǒng)使 table(x::TypeA)table(x::TypeB) 等價(jià)于 R 中的 table.TypeA(x)table.TypeB(x)
  • 在 Julia 中,傳遞值和賦值是靠引用。如果一個(gè)函數(shù)修改了數(shù)組,調(diào)用函數(shù)會(huì)發(fā)現(xiàn)值也變了。這與 R 非常不同,這使得在大數(shù)據(jù)結(jié)構(gòu)上進(jìn)行新函數(shù)操作非常高效
  • 使用 hcatvcat 來(lái)連接向量和矩陣,而不是 c, rbindcbind
  • Julia 的范圍對(duì)象如 a:b 與 R 中的定義向量的符號(hào)不同。它是一個(gè)特殊的對(duì)象,用于低內(nèi)存開(kāi)銷的迭代。要把范圍對(duì)象轉(zhuǎn)換為向量,應(yīng)該用方括號(hào)把范圍對(duì)象括起來(lái) [a:b]
  • maxmin等價(jià)于 R 語(yǔ)言中的pmaxpmin。但是所有的參數(shù)都應(yīng)該有相同的維度。而且 maximum, minimum 可以替代 R 語(yǔ)言的 max and min ,這是最大的區(qū)別。
  • 函數(shù) sum, prod, maximum, minimum和 R 語(yǔ)言中的同名函數(shù)并不相同。它們接收一個(gè)或者兩個(gè)參數(shù)。第一個(gè)參數(shù)是集合,例如一個(gè) array,如果有第二個(gè)參數(shù),這個(gè)參數(shù)可以指明數(shù)據(jù)的維度,除此之外操作相似。比如,讓 Julia 中的 A=[[1 2],[3,4]] 和 R 中的 B=rbind(c(1,2),c(3,4))比較會(huì)是一個(gè)矩陣。 接著 sum(A)sum(B)會(huì)有相同的結(jié)果, 但是 sum(A,1) 是一個(gè)包含一列和的行向量,而 sum(A,2) 是一個(gè)包含行和的列向量. 如果第二個(gè)參數(shù)是向量,如 sum(A,[1,2])=10, 需要確保第二參數(shù)沒(méi)有問(wèn)題。
  • Julia 有許多函數(shù)可以修改它們的參數(shù)。例如, sort(v)sort!(v) 函數(shù)中,帶感嘆號(hào)的可以修改 v
  • colMeans()rowMeans(), size(m, 1)size(m, 2)
  • 在 R 中,需要向量化代碼來(lái)提高性能。在 Julia 中與之相反:使用非向量化的循環(huán)通常效率最高
  • 與 R 不同,Julia 中沒(méi)有延時(shí)求值
  • 不提供 NULL 類型
  • Julia 中沒(méi)有與 R 的 assignget 所等價(jià)的語(yǔ)句

與 Python 的區(qū)別

  • 對(duì)數(shù)組、字符串等索引。Julia 索引的下標(biāo)是從 1 開(kāi)始,而不是從 0 開(kāi)始
  • 索引列表和數(shù)組的最后一個(gè)元素時(shí),Julia 使用 end ,Python 使用 -1
  • Julia 中的 Comprehensions (還)沒(méi)有條件 if 語(yǔ)句
  • for, if, while, 等塊的結(jié)尾需要 end ;不強(qiáng)制要求縮進(jìn)排版
  • Julia 沒(méi)有代碼分行的語(yǔ)法:如果在一行的結(jié)尾,輸入已經(jīng)是個(gè)完整的表達(dá)式,就直接執(zhí)行;否則就繼續(xù)等待輸入。強(qiáng)迫 Julia 的表達(dá)式分行的方法是用圓括號(hào)括起來(lái)
  • Julia 總是以列為主序的(類似 Fortran ),而 numpy 數(shù)組默認(rèn)是以行為主序的(類似 C )。如果想優(yōu)化遍歷數(shù)組的性能,從 numpy 到 Julia 時(shí)應(yīng)改變遍歷的順序。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)