国产成人精品999视频&日本一区二区亚洲人妻精品&久久久精品国产99久久精&99热这里只有成人精品国产&精品国产剧情av一区二区&成人亚洲精品久久久久app&国产精品美女高潮抽搐A片

Julia 備忘清單

本備忘清單旨在快速理解 Julia 一份簡單而粗略的語言概覽,供您參考。

入門

Julia 是什么?

  • Julia 是一種為科學(xué)計算而生的,開源、多平臺、高性能的高級編程語言
  • Julia 有一個基于 LLVM 的 JIT 編譯器,這讓使用者無需編寫底層的代碼也能擁有像 C 與 FORTRAN 那樣的性能。因為代碼在運(yùn)行中編譯,你可以在 shell 或 REPL 中運(yùn)行代碼,這也是一種推薦的工作流程
  • Julia 是動態(tài)類型的。并且提供了為并行計算和分布式運(yùn)算設(shè)計的多重派發(fā)機(jī)制
  • Julia 自帶包管理器
  • Julia 有許多內(nèi)置的數(shù)學(xué)函數(shù),包括特殊函數(shù) (例如:Gamma 函數(shù))。并且支持開箱即用的復(fù)數(shù)運(yùn)算
  • Julia 允許你通過類似 Lisp 的宏來自動生成代碼
  • Julia 誕生于 2012 年

賦值語句

answer = 42
x, y, z = 1, [1:10; ], "A string"
x, y = y, x     # 交換 x, y

常量定義

const DATE_OF_BIRTH = 2012

行尾注釋

i = 1           # 這是一行注釋
# 多行注釋
#= 這是另一行注釋 =#

函數(shù)定義

function add_one(i)
    return i + 1
end

插入 LaTeX 符號

\delta + [Tab] # δ

運(yùn)算符

:-:-
基本算數(shù)運(yùn)算+-*,/
冪運(yùn)算2^3 => 8
除法3/12 => 0.25
反向除法7\3 == 3/7 => true
取余x % yrem(x,y)
取反!true => false
等于a == b
不等于a != ba ≠ b
小于與大于<>
小于等于<=
大于等于>=
逐元素運(yùn)算(點(diǎn)運(yùn)算)[1, 2, 3] .+ [1, 2, 3] == [2, 4, 6] => true
[1, 2, 3] .* [1, 2, 3] == [1, 4, 9] => true
檢測非數(shù)值(NaN)isnan(NaN) => true
而不是 NaN == NaN => false
三元運(yùn)算符a == b ? "Equal" : "Not equal"
短路 AND 和 OR 表達(dá)式a && ba || b
對象等價a === b

shell/REPL 環(huán)境

:-:-
上一次運(yùn)算的結(jié)果ans
中斷命令執(zhí)行Ctrl + C
清屏Ctrl + L
運(yùn)行程序文件include("filename.jl")
查找 func 相關(guān)的幫助?func
查找 func 的所有定義apropos("func")
命令行模式;
包管理模式]
幫助模式?
查找特殊符號輸入方式?☆ # "☆" can be typed by \bigwhitestar<tab>
退出特殊模式,返回到 REPL在空行上按 Backspace
退出 REPLexit()Ctrl + D

缺失值與空值

:-:-
空值(Null)nothing
缺失數(shù)據(jù)missing
浮點(diǎn)數(shù)的非數(shù)值NaN
濾除缺失值collect(skipmissing([1, 2, missing])) == [1,2]
替換缺失值collect((df[:col], 1))
檢查是否有缺失值ismissing(x) 而不是 x == missing

自我檢查與反射

:-:-
類型typeof(name)
類型檢查isa(name, TypeName)
列出子類型subtypes(TypeName)
列出超類型supertype(TypeName)
函數(shù)方法methods(func)
即時編譯的字節(jié)碼code_llvm(expr)
匯編代碼code_native(expr)

隨機(jī)數(shù)

:-:-
設(shè)置隨機(jī)數(shù)種子Random.seed!(seed)
產(chǎn)生隨機(jī)數(shù)rand() # 均勻分布 [0,1)
randn() # 正態(tài)分布 (-Inf, Inf)
產(chǎn)生特定分布的隨機(jī)數(shù)using Distributions
my_dist = Bernoulli(0.2) 舉例
rand(my_dist)
以概率 p 從 A 中進(jìn)行伯努利抽樣randsubseq(A, p)
隨機(jī)重排 A 中的元素shuffle(A)

許多隨機(jī)數(shù)函數(shù)都需要 using Random

異常處理

# 拋出異常 SomeExcep
throw(SomeExcep())
# 再次引發(fā)當(dāng)前的異常
rethrow()

定義新異常 NewExcep

struct NewExcep <: Exception
    v::String
end
Base.showerror(io::IO, e::NewExcep) = print(io, "A problem with $(e.v)!")

throw(NewExcep("x"))
# 拋出帶文本的異常
error(msg)

異常處理流程

try
  # 進(jìn)行一些可能會失敗的操作
  catch ex
    if isa(ex, SomeExcep)
        # 處理異常 SomeExcep
    elseif isa(ex, AnotherExcep)
        # 處理另一個異常 AnotherExcep
    else
        # 處理其余的異常
    end
  finally
  # 永遠(yuǎn)執(zhí)行這些語句
end

類型

# 類型注釋
var::TypeName
# 類型聲明
struct Programmer
    name::String
    birth_year::UInt16
    fave_language::AbstractString
end
# 可變類型聲明
struct 替換為 mutable struct
# 類型別名
const Nerd = Programmer
# 類型構(gòu)造器
methods(TypeName)
# 類型實例
me = Programmer("Ian", 1984, "Julia")
me = Nerd("Ian", 1984, "Julia")
# 子類型聲明
abstract type Bird end
struct Duck <: Bird
    pond::String
end
# 參數(shù)化類型
struct Point{T <: Real}
    x::T
    y::T
end

p = Point{Float64}(1,2)
# 聯(lián)合類型
Union{Int, String}
# 遍歷類型層級
supertype(TypeName) 和 subtypes(TypeName)
# 默認(rèn)的超類型
Any
# 所有字段
fieldnames(TypeName)
# 所有字段類型
TypeName.types

標(biāo)準(zhǔn)庫

:-:-
Randomrand, randn, randsubseq
Statisticsmean, std, cor, median, quantile
LinearAlgebraI, eigvals, eigvecs, det, cholesky
SparseArrayssparse, SparseVector, SparseMatrixCSC
Distributed@distributed, pmap, addprocs
DatesDateTime, Date

表達(dá)式

使用引用 :( ... ) 或塊引用 quote ... end 可以創(chuàng)建一個表達(dá)式,就像 parse(str),和 Expr(:call, ...)。

x = 1
line = "1 + $x"         # 一些代碼
expr = Meta.parse(line) # 生成一個 Expr 對象
typeof(expr) == Expr # true
dump(expr)           # 打印生成抽象語法(AST)
eval(expr) == 2      # 對 Expr 對象求值: true

Julia 具有同像性:程序被表示為語言本身的數(shù)據(jù)結(jié)構(gòu)。 實際上 Julia 語言里的任何東西都是一個表達(dá)式 Expr。符號(Symbols)即駐留字符串 ,以冒號 : 為前綴。相對于其他類型來說,符號效率更高。它也經(jīng)常用作標(biāo)識符、字典的鍵或者數(shù)據(jù)表里的列名。符號不能進(jìn)行拼接。

輸入/輸出

讀取流

stream = stdin
for line in eachline(stream)
    # 做點(diǎn)啥
end

讀取文件

open(filename) do file
    for line in eachline(file)
        # 做點(diǎn)啥
    end
end

讀取/寫入 CSV 文件

# 讀取 CSV 文件
using CSV
data = CSV.File(filename)
# 寫入 CSV 文件
[label](koajs.md)CSV.write(filename, data)

讀取/保存 Julia 對象

using JLD
# 保存 Julia 對象
save(filename, "object_key", object, ...)
# 讀取 Julia 對象
d = load(filename) # 返回對象的字典

讀取/保存 HDF5

using HDF5
# 保存 HDF5
h5write(filename, "key", object)
# 讀取 HDF5
h5read(filename, "key")

宏允許你在程序中自動生成代碼(如:表達(dá)式)

# 定義
macro macroname(expr)
    # 做點(diǎn)啥
end

使用

macroname(ex1, ex2, ...) 或 @macroname ex1, ex2, ...

內(nèi)置的宏

@assert    # assert (單元測試)
@which     # 查看對特定參數(shù)使用的方法/查找函數(shù)所在的模塊
@time      # 運(yùn)行時間與內(nèi)存分配統(tǒng)計
@elapsed   # 返回執(zhí)行用時
@allocated # 查看內(nèi)存分配
@async     # 異步任務(wù)

using Test
@test          # 精確相等
@test x ≈ y    # 近似相等 isapprox(x, y)

using Profile
@profile        # 優(yōu)化

創(chuàng)建 衛(wèi)生宏 (hygienic macros)的規(guī)則:

  • 在宏的內(nèi)部只通過 local 聲明本地變量
  • 在宏的內(nèi)部不使用 eval
  • 轉(zhuǎn)義插值表達(dá)式以避免宏變大:$(esc(expr))

并行計算

并行計算相關(guān)的工具可以在標(biāo)準(zhǔn)庫 Distributed 里找到

# 啟動帶 N 各 worker 的 REPL
julia -p N
# 可用的 worker 數(shù)量
nprocs()
# 添加 N 個 worker
addprocs(N)
# 查看所有 worker 的 pid
for pid in workers()
    println(pid)
end
# 獲得正在執(zhí)行的 worker 的 id
myid()
# 移除 worker
rmprocs(pid)
# 在特定 pid 的 worker 上運(yùn)行 f(args)
r = remotecall(f, pid, args...)
# 或:
r = @spawnat pid f(args)
...
fetch(r)
# 在特定 pid 的 worker 上運(yùn)行 f(args) (更高效)
remotecall_fetch(f, pid, args...)
# 在任意 worker 上運(yùn)行 f(args)
r = @spawn f(args) ... fetch(r)
# 在所有 worker 上運(yùn)行 f(args)
r = [@spawnat w f(args) for w in workers()] ... fetch(r)
# 讓表達(dá)式 expr 在所有 worker 上執(zhí)行
@everywhere expr
# 并行化帶規(guī)約函數(shù) red 的循環(huán)
sum = @distributed (red) for i in 1:10^6
    # 進(jìn)行并行任務(wù)
end
# 將 f 用用到集合 coll 中的所有元素上
pmap(f, coll)

數(shù)組

:-:-
聲明數(shù)組arr = Float64[]
預(yù)分配內(nèi)存sizehint!(arr, 10^4)
訪問與賦值arr = Any[1,2]
arr[1] = "Some text"
從 m 到 n 的子數(shù)組arr[m:n]
n 個 0.0 填充的數(shù)組zeros(n)
n 個 1.0 填充的數(shù)組ones(n)
n 個隨機(jī) Int8 填充的數(shù)組rand(Int8, n)
用值 val 填充數(shù)組fill!(arr, val)
彈出最后一個元素pop!(arr)
彈出第一個元素popfirst!(a)
n 個 #undef 填充的數(shù)組Vector{Type}(undef,n)
n 個從 startstop 的等間距數(shù)range(start,stop=stop,length=n)
將值 val 作為最后一個元素壓入數(shù)組push!(arr, val)
將值 val 作為第一個元素壓入數(shù)組pushfirst!(arr, val)
刪除指定索引值的元素deleteat!(arr, idx)
數(shù)組排序sort!(arr)
b 連接到 aappend!(a,b)
轉(zhuǎn)化為字符串,并以 delim 分隔join(arr, delim)

# 數(shù)組比較
a = [1:10;]
b = a      # b 指向 a
a[1] = -99
a == b     # true
# 復(fù)制元素(而不是地址)/深拷貝
b = copy(a)
b = deepcopy(a)
# 檢查值 val 是否在數(shù)組 arr 中
in(val, arr) # 或
val in arr
# 改變維數(shù)
reshape(1:6, 3, 2)' == [1 2 3; 4 5 6]

線性代數(shù)

:-:-
單位矩陣I
定義矩陣M = [1 0; 0 1]
矩陣維數(shù)size(M)
選出第 i 行M[i, :]
選出第 j 列M[:, j]
水平拼接M = [a b] 或 M = hcat(a, b)
豎直拼接M = [a ; b]M = vcat(a, b)
矩陣轉(zhuǎn)置transpose(M)
共軛轉(zhuǎn)置M'adjoint(M)
跡(trace)tr(M)
行列式det(M)
秩(rank)rank(M)
特征值eigvals(M)
特征向量eigvecs(M)
矩陣求逆inv(M)
解矩陣方程 M*x == vM\vinv(M)*v 更好
求 Moore-Penrose 偽逆pinv(M)

控制流與循環(huán)

條件語句

if x < y
    println("x is less than y")
elseif x > y
    println("x is greater than y")
else
    println("x is equal to y")
end

for 循環(huán)

for i in 1:10
    println(i)
end

嵌套循環(huán)

for i in 1:10, j = 1:5
    println(i*j)
end

枚舉

for (idx, val) in enumerate(arr)
    println("the $idx-th element is $val")
end

while 循環(huán)

while bool_expr
    # 做點(diǎn)啥
end

退出循環(huán)

julia> i = 0
julia> while true
           global i += 1
           i > 5 && break
           println(i)
       end

退出本次循環(huán)

for i = 1:6
    iseven(i) && continue
    println(i)
end

數(shù)字相關(guān)

整數(shù)類型

IntNUIntN, 且 N ∈ {8, 16, 32, 64, 128}, BigInt

浮點(diǎn)類型

FloatNN ∈ {16, 32, 64} BigFloat

類型的最大和最小值

typemin(Int8)
typemax(Int64)

復(fù)數(shù)類型

Complex{T<:Real}

虛數(shù)單位

im

機(jī)器精度

eps() # 等價于 eps(Float64)

圓整

round()       # 浮點(diǎn)數(shù)圓整
round(Int, x) # 整數(shù)圓整

類型轉(zhuǎn)換

# 嘗試進(jìn)行轉(zhuǎn)換/可能會報錯
convert(TypeName, val)
# 調(diào)用類型構(gòu)造器轉(zhuǎn)換
TypeName(val)

全局常量

pi # 3.1415...
π  # 3.1415...
im # real(im * im) == -1

更多常量

using Base.MathConstants

模塊

定義

module PackageName
# 添加模塊定義
# 使用 export 讓定義對外可見
end

包含文件 filename.jl

include("filename.jl")

加載

using ModuleName # 導(dǎo)出所有名稱
# 僅導(dǎo)出 x, y
using ModuleName: x, y
# 僅導(dǎo)出 x, y
using ModuleName.x, ModuleName.y:
# 僅導(dǎo)出 ModuleName
import ModuleName 
# 僅導(dǎo)出 x, y
import ModuleName: x, y 
# 僅導(dǎo)出 x, y
import ModuleName.x, ModuleName.y

usingimport 只有一點(diǎn)區(qū)別:使用 using 時,你需要寫 function Foo.bar(.. 來給 Foo 模塊的函數(shù) bar 增添一個新方法; 而使用 import Foo.bar 時,只需寫 function bar(... 就能達(dá)到同樣的效果

導(dǎo)出

# 得到模塊導(dǎo)出名稱的數(shù)組
names(ModuleName)

# 包含未導(dǎo)出的、棄用的
# 和編譯器產(chǎn)生的名稱
names(ModuleName, all::Bool)
# 也顯示從其他模塊顯式導(dǎo)入的名稱
names(ModuleName, all::Bool, imported::Bool)

包管理

介紹

一個程序包必須先注冊,然后才能在包管理器中看到它。在 Julia 1.0 中,有兩種使用包管理器的方法:

  • 一是通過 using Pkg 導(dǎo)入 Pkg 模塊,然后用它的函數(shù)管理其他包;
  • 或者在 REPL 中輸入 ],然后按回車。進(jìn)入特殊的交互式包管理模式。 (要從包管理模式返回 REPL,只需要在空行上按退格鍵 BACKSPACE 就行了)

注意新的工具總是先添加到交互式模式中,然后才會加入 Pkg 模塊

在 Julia 會話中使用 Pkg 管理包

:-:-
列出已安裝的包Pkg.status()
更新所有包Pkg.update()
安裝包Pkg.add("PackageName")
重新構(gòu)建包Pkg.build("PackageName")
使用包using PackageName
刪除包Pkg.rm("PackageName")

交互式包管理模式

:-:-
添加包add PackageName
刪除包rm PackageName
更新包update PackageName
使用開發(fā)版本dev PackageNamedev GitRepoUrl
返回普通發(fā)行版free PackageName