Julia 的語(yǔ)法和 MATLAB 很像。但 Julia 不是簡(jiǎn)單地復(fù)制 MATLAB ,它們有很多句法和功能上的區(qū)別。以下是一些值得注意的區(qū)別:
A[i,j]
A=B
之后,對(duì) B
賦值也會(huì)修改 A
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)的高效。sqrt(-1)
用 im
來(lái)表示2^-1
的表達(dá)式因?yàn)椴皇钦蕉鴴伋鲆粋€(gè)異常。N
,而不是 Nx1
。例如, rand(N)
生成的是一維數(shù)組[x,y,z]
來(lái)連接標(biāo)量或數(shù)組,連接發(fā)生在第一維度(“垂直”)上。對(duì)于第二維度(“水平”)上的連接,需要使用空格,如 [x y z]
。 要想構(gòu)造塊矩陣,盡量使用語(yǔ)法 [a b; c d]
a:b
和 a:b:c
中的冒號(hào),用來(lái)構(gòu)造 Range
對(duì)象。使用 linspace
構(gòu)造一個(gè)滿向量,或者通過(guò)使用方括號(hào)來(lái)“連接”范圍,如 [a:b]
return
關(guān)鍵字,而不是把它們列在函數(shù)定義中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.tic()
和 toc()
println
函數(shù)可以用來(lái)打印值并換行A
和 B
是數(shù)組, A == B
并不返回布爾值數(shù)組。應(yīng)該使用 A .== B
。其它布爾值運(yùn)算符可以類比, <
, >
, !=
等&
、|
和 $
表示位運(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...)
svd
返回的奇異值是向量而不是完整的對(duì)角矩陣...
不用來(lái)將一行代碼拆成多行。Instead, incomplete
expressions automatically continue onto the next line.ans
是交互式會(huì)話中執(zhí)行的最后一條表達(dá)式的值;以其它方式執(zhí)行的表達(dá)式的值,不會(huì)賦值給它Julia 也想成為數(shù)據(jù)分析和統(tǒng)計(jì)編程的高效語(yǔ)言。與 R 的區(qū)別:
=
賦值,不提供 <-
或 <<-
等箭頭式運(yùn)算符[1, 2, 3]
等價(jià)于 R 中的 c(1, 2, 3)
A
和 B
是矩陣,那么矩陣乘法在 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)
0
和 1
不是布爾值。不能寫 if (1)
,因?yàn)?if
語(yǔ)句僅接受布爾值作為參數(shù)。應(yīng)寫成 if true
nrow
和 ncol
。應(yīng)該使用 size(M, 1)
替代 nrow(M)
;使用 size(M, 2)
替代 ncol(M)
X
調(diào)用 svd(X, true)
1
和 c(1)
是一樣的。在 Julia 中,它們完全不同。例如若 x
和 y
為向量,則 x' * y
是一個(gè)單元素向量,而不是標(biāo)量。要得到標(biāo)量,應(yīng)使用 dot(x, y)
diag()
和 diagm()
與 R 中的不同diag(M) = ones(n)
Julia 不贊成把 main 命名空間塞滿函數(shù)。大多數(shù)統(tǒng)計(jì)學(xué)函數(shù)可以在 擴(kuò)展包中找到,比如 DataFrames 和 Distributions 包:
list(a = 1, b = 2)
,應(yīng)該使用 (1, 2)
table(x::TypeA)
和 table(x::TypeB)
等價(jià)于 R 中的 table.TypeA(x)
和 table.TypeB(x)
hcat
和 vcat
來(lái)連接向量和矩陣,而不是 c
, rbind
和 cbind
a:b
與 R 中的定義向量的符號(hào)不同。它是一個(gè)特殊的對(duì)象,用于低內(nèi)存開(kāi)銷的迭代。要把范圍對(duì)象轉(zhuǎn)換為向量,應(yīng)該用方括號(hào)把范圍對(duì)象括起來(lái) [a:b]
max
和min
等價(jià)于 R 語(yǔ)言中的pmax
和pmin
。但是所有的參數(shù)都應(yīng)該有相同的維度。而且
maximum
, minimum
可以替代 R 語(yǔ)言的 max
and min
,這是最大的區(qū)別。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)題。sort(v)
和 sort!(v)
函數(shù)中,帶感嘆號(hào)的可以修改 v
colMeans()
和 rowMeans()
, size(m, 1)
和 size(m, 2)
NULL
類型assign
或 get
所等價(jià)的語(yǔ)句end
,Python 使用 -1end
;不強(qiáng)制要求縮進(jìn)排版numpy
數(shù)組默認(rèn)是以行為主序的(類似 C )。如果想優(yōu)化遍歷數(shù)組的性能,從 numpy
到 Julia 時(shí)應(yīng)改變遍歷的順序。
更多建議: