# 启动带 N 各 worker 的 REPL julia -p N # 可用的 worker 数量 nprocs() # 添加 N 个 worker addprocs(N) # 查看所有 worker 的 pid for pid in workers() println(pid) end # 获得正在执行的 worker 的 id myid() # 移除 worker rmprocs(pid) # 在特定 pid 的 worker 上运行 f(args) r = remotecall(f, pid, args...) # 或: r = @spawnat pid f(args) ... fetch(r) # 在特定 pid 的 worker 上运行 f(args) (更高效) remotecall_fetch(f, pid, args...) # 在任意 worker 上运行 f(args) r = @spawn f(args) ... fetch(r) # 在所有 worker 上运行 f(args) r = [@spawnat w f(args) for w in workers()] ... fetch(r) # 让表达式 expr 在所有 worker 上执行 @everywhere expr # 并行化带规约函数 red 的循环 sum = @distributed (red) for i in1:10^6 # 进行并行任务 end # 将 f 用用到集合 coll 中的所有元素上 pmap(f, coll)
数组
:-
:-
声明数组
arr = Float64[]
预分配内存
sizehint!(arr, 10^4)
访问与赋值
arr = Any[1,2] arr[1] = "Some text"
从 m 到 n 的子数组
arr[m:n]
n 个 0.0 填充的数组
zeros(n)
n 个 1.0 填充的数组
ones(n)
n 个随机 Int8 填充的数组
rand(Int8, n)
用值 val 填充数组
fill!(arr, val)
弹出最后一个元素
pop!(arr)
弹出第一个元素
popfirst!(a)
n 个 #undef 填充的数组
Vector{Type}(undef,n)
n 个从 start 到 stop 的等间距数
range(start,stop=stop,length=n)
将值 val 作为最后一个元素压入数组
push!(arr, val)
将值 val 作为第一个元素压入数组
pushfirst!(arr, val)
删除指定索引值的元素
deleteat!(arr, idx)
数组排序
sort!(arr)
将 b 连接到 a 后
append!(a,b)
转化为字符串,并以 delim 分隔
join(arr, delim)
1 2 3 4 5 6 7 8 9 10 11 12 13
# 数组比较 a = [1:10;] b = a # b 指向 a a[1] = -99 a == b # true # 复制元素(而不是地址)/深拷贝 b = copy(a) b = deepcopy(a) # 检查值 val 是否在数组 arr 中 in(val, arr) # 或 val in arr # 改变维数 reshape(1:6, 3, 2)' == [123; 456]
线性代数
:-
:-
单位矩阵
I
定义矩阵
M = [1 0; 0 1]
矩阵维数
size(M)
选出第 i 行
M[i, :]
选出第 j 列
M[:, j]
水平拼接
M = [a b] 或 M = hcat(a, b)
竖直拼接
M = [a ; b] 或 M = vcat(a, b)
矩阵转置
transpose(M)
共轭转置
M' 或 adjoint(M)
迹(trace)
tr(M)
行列式
det(M)
秩(rank)
rank(M)
特征值
eigvals(M)
特征向量
eigvecs(M)
矩阵求逆
inv(M)
解矩阵方程 M*x == v
M\v 比 inv(M)*v 更好
求 Moore-Penrose 伪逆
pinv(M)
控制流与循环
条件语句
1 2 3 4 5 6 7
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 循环
1 2 3
for i in1:10 println(i) end
嵌套循环
1 2 3
for i in1:10, j = 1:5 println(i*j) end
枚举
1 2 3
for (idx, val) in enumerate(arr) println("the $idx-th element is $val") end
while 循环
1 2 3
while bool_expr # 做点啥 end
退出循环
{4}
1 2 3 4 5 6
julia> i = 0 julia> whiletrue global i += 1 i > 5 && break println(i) end
module PackageName # 添加模块定义 # 使用 export 让定义对外可见 end
包含文件 filename.jl
1
include("filename.jl")
加载
1 2 3 4 5 6 7 8 9 10 11
using ModuleName # 导出所有名称 # 仅导出 x, y using ModuleName: x, y # 仅导出 x, y using ModuleName.x, ModuleName.y: # 仅导出 ModuleName import ModuleName # 仅导出 x, y import ModuleName: x, y # 仅导出 x, y import ModuleName.x, ModuleName.y
using 和 import 只有一点区别:使用 using 时,你需要写 function Foo.bar(.. 来给 Foo 模块的函数 bar 增添一个新方法; 而使用 import Foo.bar 时,只需写 function bar(... 就能达到同样的效果