贡献者: addis
Julia 从 Matlab 和 C/C++ 借鉴了不少语法,如果你两种语言都已经会了,那么 Julia 是十分简单的。本章的目的就是为已经学习过类似语言的读者提供一个 Julia 语言的快速入门笔记。
Ubuntu/Debian 安装方法。
sudo apt install julia
或者
sudo snap install Julia --classic
如果版本较老,最好还是从官网下载安装包,直接解压即可使用 bin/julia
执行文件。也可以创建软链 sudo ln -s /home/用户名/julia-xxx/bin/julia /usr/bin/julia
另外本地的 Jupyter Notebook 也支持 Julia。在 julia 命令行里面运行 import Pkg
,Pkg.add("IJulia")
。现在打开 Jupyter notebook 就可以新建 julia 文档了。
println("hello world")
#
,或者 #=一些注释=#
,多行注释也可以和 python 一样用 """..."""
Ctrl + D
退出或者 exit()
退出
ans
变量和 Matlab 一样,用于显示上一次运算的输出结果(结果赋值给变量的除外)
println("$var1 some words $var2")
中 var1, var2
可以是数字、字符串等,这和 println(var1, " some words ", var2)
等效。其实这是字符串的功能而不是 println
特有的。
b = 2a
和 c = 2(b+3)
都可以省略乘号。注意 1/2a
相当于 1/(2a)
2/3
返回双精度类型 Float64
而不是整数
2//3
返回 Rational{Int64}
类型,相当于用两个 Int64
整数来表示分数,分数之间的运算没有误差
1 + 2im
,相当于 ComplexF64(0,2)
。又例如 1//2 + (3//4)im
的类型是 Complex{Rational{Int64}}
typeof()
查看某个变量的类型
::类型
限制变量类型
typemax(Int64)
,typemin(Int64)
BigInt
和 BigFloat
(底层是 GMP)
nothing
,然后运行垃圾回收 GC.gc()
即可。
typeof(Float64)
是 DataType
。
Array{T, 1}
不区分行和列,但是二维数组 Array{T, 2}
可以区分行向量和列向量
Array{类型,1}
也叫 Vector{类型}
;Array{类型,2}
也叫 Matrix{类型}
。
a[:, j, :]
size(矩阵, 维度)
,元素个数 length()
,isempty()
检查空矩阵,reverse()
元素倒序排序
zeros(整数)
或 zeros(整数, 整数)
分别返回 Array{Float64,1}
和 Array{Float64,2}
rand(ComplexF64, N1, N2, ...)
。
hash(矩阵)
,类型为 UInt64
。把运算结果的 hash 输出可以保证计算过程不被优化掉。事实上可以作用于任何对象(包括自定义类型)。
Int64
a = [1 2; 3 4]
得到 Array{Float64,2}
注意不能用逗号! 也可以不写 ;
而使用换行。
[1, 2]
和 [1; 2]
的类型是 Array{Float64,1}
,但 [1 2]
的类型是 Array{Int64,2}
a[:, 1]
或者 a[1, :]
仍然得到 Array{Float64,2}
a[:, 1] = [3; 4]
可以修改 a
的值
a = b
是浅复制,a
改变了 b
也会改变(同一对象)。
a === b
来判断是否是同一对象。
b = a[:, 1]
却是复制数据。
a
作为参数传给函数是 pass by reference,相当于 C 语言传递指针
Float32[1, 4, 5]
。
Any
。例如 ["a", 1.23]
的类型就是 Vector{Any}
即 Array{Any, 1}
函数.(数组)
可以对数组内的每个元素分别作用,返回数组。例如 sin.([1,2,3])
。sin([1,2,3])
是错误的用法。
exp([1 2;3 4])
是矩阵的指数,exp.([1 2;3 4])
是逐个元素做指数。
collect(1:5)
可以把类似 range 的类型变为 Vector{}
类型。
a[:, 1]
作为参数传给函数是 pass by value,如果需要 by reference,使用 view
函数获取 SubArray
类
SubArray
不存数据,可以用来给函数参数 pass by reference
SubArray
类型的 5 个参数 SubArray{标量类,维数,矩阵类,Tuple{各维度索引类型},是否支持快速索引}
view(a, :, 1)
的类型是 SubArray{Int64,1,Matrix{Int64},Tuple{Base.Slice{Base.OneTo{Int64}},Int64},true}
view(a, 1, :)
的类型是 SubArray{Int64,1,Matrix{Int64},Tuple{Int64,Base.Slice{Base.OneTo{Int64}}},true}
view(a, 1:2, 2:3)
的类型是 SubArray{Int64,2,Matrix{Int64},Tuple{UnitRange{Int64},UnitRange{Int64}},false}
SubArray <: AbstractArray{T,Ndim} <: Any
Array{T,Ndim} <: DenseArray{T,Ndim} <: AbstractArray{T,Ndim} <: Any
AbstractArray
,就可以同时接受 Array, SubArray
。
SubArray
的结构
struct SubArray{T,N,P,I,L} <: AbstractArray{T,N}
parent::P
indices::I
offset1::Int # for linear indexing and pointer, only valid when L==true
stride1::Int # used only for linear indexing
...
end
1:5
等效于 range(1,5)
,类型是 UnitRange{Int64}
1:3:9
等效于 StepRange(1, 3, 9)
,类型是 StepRange{Int64, Int64}
注意 StepRange
类型的参数只能是整数。StepRange(1, Int8(3), 9)
的类型是 StepRange{Int64, Int8}
1.2:5.1
(等效于 range(1.2,5.1)
)和 1:0.2:4.1
(等效于 1:0.2:4
和 range(1,4,16)
)的类型是 StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}
. range(2,4,3)
虽然每个元素都是整数,但类型也是一样的。
LinRange(初始值,中止值,个数)
概念上是等间距数组,相当于 Matlab 的 linspace
。但类型为 LinRange{Float64, Int64}
。
range(初始值,中止值,个数)
有什么不同?AbstractRange <: AbstractVector <: Any
,都可以像数组一样用 size(x, dim)
来获取尺寸,length()
获取元素个数,可以用 x[i]
获取元素。
tr(A)
,行列式 det(A)
,逆 inv(A)
,本征值 eigvals(A)
,本征矢 eigvecs(A)
,LU 分解(链接未完成)factorize(A)
Symmetric
,Hermitian
,UpperTriangular
,LowerTriangular
,Tridiagonal
,SymTridiagonal
,Bidiagonal
,Diagonal
using SparseArrays
,然后 S = sparse(行标矢量,列标矢量,非零元矢量)
可以创建 CSC 格式的矩阵:SparseMatrixCSC{矩阵元类型, 指标类型}
using LinearAlgebra.BLAS;m=3;n=4;kl=1;ku=1;alpha=1.;beta=0.;A=rand(kl+ku+1,n);x=rand(Float64,n); y=zeros(Float64,m); gbmv!('N', m, kl, ku, alpha, A, x, beta, y)
其中矩阵尺寸为 m
乘 n
,上下子对角线数量 ku, kl
。
geev!(jobvl, jobvr, A)
;对称矩阵本征问题 syev!(jobz, uplo, A)
;对称三对角矩阵本征问题 stev!(job, dv, ev)
julia <file>
运行脚本,用 julia <file> <arg1> <arg2>
给出 arguments
include("/Users/addis/Desktop/main.jl")
(路径不区分大小写),也支持反斜杠,但要转义成 \\
abspath(PROGRAM_FILE) == @__FILE__
第三方画图包 Plots
,无需安装
using Plots
x = 1:10; y = rand(10); # These are the plotting data
plot(x,y)
b = 3;
for a = 1:5
if a < b
println(a, " < ", b)
elseif a > b
println(a, " > ", b)
else
println(a, " = ", b)
end
end
其中 1:5
的类型是 UnitRange{Int64}
。若令 a = 1:5
,可以使用 a[i]
获取 “元素”。类似地,1:2:5
的类型是 StepRange{Int64, Int64}
。
for i in [1,4,0]
if 条件; 命令; end
函数定义
function sphere_vol(r)
return 4/3*pi*r^3
end
time()
try
一些命令
catch y
if isa(y, 错误类型1)
一些命令
elseif isa(y, 错误类型2)
一些命令
end
end
DomainError
(例如 sqrt(-1)
),BoundsError
(数组指标超出范围)。
要把任意变量存到文件,用 using Serialization
,除此之外常用的还有 using JLD2
。
using Serialization
a = randn(100,100)
f = serialize("file1.dat", a)
a1 = deserialize("file1.dat")
println(a == a1)
pwd()
,更改路径 cd()
readdir()
返回当前路径或指定路径中的文件和文件夹
f = open("文件名", "r")
打开文件读取,close(f)
关闭文件。
eof(f)
用于判断是否到达文件末尾
s = readline(f)
读取下一行
s = read(f, String)
整个文件读入字符串
using DelimitedFiles; m = readdlm("文件名")
从文本文件中读取矩阵
write(file, str)
把字符串写入文本文件
using DelimitedFiles; writedlm("文件名", 矩阵)
把矩阵写入文本文件(用空格与回车)
module 模块名; 定义变量、类型、函数; end
。
import 模块名
后,调用函数(或变量)用 模块名.函数名
,但 using 模块名
后,可以省略 模块名.
using
指定内容,用 using 模块名: 函数1, 函数2, 变量3
。
import 模块名: 函数1, 函数2, 变量3
应该和上一条等效。
import 模块名 as 自定义名
和 python 一样。
 
 
 
 
 
 
 
 
 
 
 
友情链接: 超理论坛 | ©小时科技 保留一切权利