Julia 的語法和 MATLAB 很像。但 Julia 不是簡單地復制 MATLAB ,它們有很多句法和功能上的區(qū)別。以下是一些值得注意的區(qū)別:
A[i,j]
A=B
之后,對 B
賦值也會修改 A
a(4) = 3.2
會創(chuàng)建一個數(shù)組 a = [0 0 0 3.2]
,即為a分配了內存并且將每個元素初始化為0,然后為第四個元素賦值3.2,而 a(5) = 7
會為數(shù)組a增加長度,并且給第五個元素賦值7。
Julia 把賦值和分配內存分開了:
如果 a
長度為4, a[5] = 7
會拋出一個錯誤。 Julia 有一個專用的 push!
函數(shù)來向 Vectors
里增加元素。并且遠比Matlab的 a(end+1) = val
來的高效。sqrt(-1)
用 im
來表示2^-1
的表達式因為不是正式而拋出一個異常。N
,而不是 Nx1
。例如, rand(N)
生成的是一維數(shù)組[x,y,z]
來連接標量或數(shù)組,連接發(fā)生在第一維度(“垂直”)上。對于第二維度(“水平”)上的連接,需要使用空格,如 [x y z]
。 要想構造塊矩陣,盡量使用語法 [a b; c d]
a:b
和 a:b:c
中的冒號,用來構造 Range
對象。使用 linspace
構造一個滿向量,或者通過使用方括號來“連接”范圍,如 [a:b]
return
關鍵字,而不是把它們列在函數(shù)定義中sum
, prod
, max
等約簡操作,如果被調用時參數(shù)只有一個,作用域是數(shù)組的所有元素,如 sum(A)
sort
等函數(shù),默認按列方向操作。( sort(A)
等價于 sort(A,1)
)。要想排序 1xN
的矩陣,使用 sort(A,2)
A
是 2 維數(shù)組, fft(A)
計算的是 2 維 FFT. 尤其注意的是, 它不等效于 fft(A,1)
, 后者計算的是按列的 1 維 FFT.tic()
和 toc()
println
函數(shù)可以用來打印值并換行A
和 B
是數(shù)組, A == B
并不返回布爾值數(shù)組。應該使用 A .== B
。其它布爾值運算符可以類比, <
, >
, !=
等&
、|
和 $
表示位運算“和”、“或”以及“異或”。它們和python中的位運算符有著相同的運算符優(yōu)先級,和c語言中的位運算符優(yōu)先級并不一樣。
它們能被應用在標量上或者應用在兩個數(shù)組間(對每個相同位置的元素分別進行邏輯運算,返回一個由結果組成的新數(shù)組)。
值得注意的是它們的運算符優(yōu)先級,別忘了括號:
如果想要判斷變量 A
是等于1還是2, 要這樣寫 (A .== 1) | (A .== 2)
。...
把集合中的元素作為參數(shù)傳遞給函數(shù),如 xs=[1,2]; f(xs...)
svd
返回的奇異值是向量而不是完整的對角矩陣...
不用來將一行代碼拆成多行。Instead, incomplete
expressions automatically continue onto the next line.ans
是交互式會話中執(zhí)行的最后一條表達式的值;以其它方式執(zhí)行的表達式的值,不會賦值給它Julia 也想成為數(shù)據(jù)分析和統(tǒng)計編程的高效語言。與 R 的區(qū)別:
=
賦值,不提供 <-
或 <<-
等箭頭式運算符[1, 2, 3]
等價于 R 中的 c(1, 2, 3)
A
和 B
是矩陣,那么矩陣乘法在 Julia 中為 A * B
, R 中為 A %*% B
。在 R 中,第一個語句表示的是逐元素的 Hadamard 乘法。要進行逐元素點乘,Julia 中為 A .* B
'
運算符做矩陣轉置。 Julia 中 A'
等價于 R 中 t(A)
if
語句或 for
循環(huán)時不需要寫圓括號:應寫 for i in [1, 2, 3]
而不是 for (i in c(1, 2, 3))
;應寫 if i == 1
而不是 if (i == 1)
0
和 1
不是布爾值。不能寫 if (1)
,因為 if
語句僅接受布爾值作為參數(shù)。應寫成 if true
nrow
和 ncol
。應該使用 size(M, 1)
替代 nrow(M)
;使用 size(M, 2)
替代 ncol(M)
X
調用 svd(X, true)
1
和 c(1)
是一樣的。在 Julia 中,它們完全不同。例如若 x
和 y
為向量,則 x' * y
是一個單元素向量,而不是標量。要得到標量,應使用 dot(x, y)
diag()
和 diagm()
與 R 中的不同diag(M) = ones(n)
Julia 不贊成把 main 命名空間塞滿函數(shù)。大多數(shù)統(tǒng)計學函數(shù)可以在 擴展包中找到,比如 DataFrames 和 Distributions 包:
list(a = 1, b = 2)
,應該使用 (1, 2)
table(x::TypeA)
和 table(x::TypeB)
等價于 R 中的 table.TypeA(x)
和 table.TypeB(x)
hcat
和 vcat
來連接向量和矩陣,而不是 c
, rbind
和 cbind
a:b
與 R 中的定義向量的符號不同。它是一個特殊的對象,用于低內存開銷的迭代。要把范圍對象轉換為向量,應該用方括號把范圍對象括起來 [a:b]
max
和min
等價于 R 語言中的pmax
和pmin
。但是所有的參數(shù)都應該有相同的維度。而且
maximum
, minimum
可以替代 R 語言的 max
and min
,這是最大的區(qū)別。sum
, prod
, maximum
, minimum
和 R 語言中的同名函數(shù)并不相同。它們接收一個或者兩個參數(shù)。第一個參數(shù)是集合,例如一個 array,如果有第二個參數(shù),這個參數(shù)可以指明數(shù)據(jù)的維度,除此之外操作相似。比如,讓 Julia 中的 A=[[1 2],[3,4]]
和 R 中的 B=rbind(c(1,2),c(3,4))
比較會是一個矩陣。 接著 sum(A)
和sum(B)
會有相同的結果, 但是 sum(A,1)
是一個包含一列和的行向量,而 sum(A,2)
是一個包含行和的列向量. 如果第二個參數(shù)是向量,如 sum(A,[1,2])=10
, 需要確保第二參數(shù)沒有問題。sort(v)
和 sort!(v)
函數(shù)中,帶感嘆號的可以修改 v
colMeans()
和 rowMeans()
, size(m, 1)
和 size(m, 2)
NULL
類型assign
或 get
所等價的語句end
,Python 使用 -1end
;不強制要求縮進排版numpy
數(shù)組默認是以行為主序的(類似 C )。如果想優(yōu)化遍歷數(shù)組的性能,從 numpy
到 Julia 時應改變遍歷的順序。
更多建議: