鍍金池/ 教程/ Java/ 與其它語言的區(qū)別
類型轉(zhuǎn)換和類型提升
方法
嵌入式 Julia
交互
調(diào)用 C 和 Fortran 代碼
類型
代碼性能優(yōu)化
多維數(shù)組
元編程
函數(shù)
簡介
線性代數(shù)
與其它語言的區(qū)別
數(shù)學(xué)運算和基本函數(shù)
構(gòu)造函數(shù)
控制流
常見問題
并行計算
擴展包
開發(fā)擴展包
開始
字符串
運行外部程序
變量的作用域
模塊
網(wǎng)絡(luò)和流
代碼樣式
復(fù)數(shù)和分數(shù)
可空類型
整數(shù)和浮點數(shù)
變量
日期和時間

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

與 MATLAB 的區(qū)別

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

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

與 R 的區(qū)別

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

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

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

與 Python 的區(qū)別

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