# julia1.0需要using LinearAlgebra
在开始讲解之前,我们先建立一个简单的线性系统:
A = rand(3,3)
x = fill(1, (3,1))
b = A * x
**Factorizations:**
1. LU分解
PA = LU
此处P为置换矩阵,L是下三角矩阵(对角线元素为1),U是上三角矩阵
julia使用函数lufact可以获得矩阵A,L,U
Alu = lufact(A) # 在julia1.0中,Alu = lu(A)
也可以查看Alu的type:typeof(Alu)
查看矩阵P
P = Alu[:P] # julia1.0使用Alu.P
L = Alu[:L] # julia1.0使用Alu.L
U = Alu[:U] # julia1.0使用Alu.U
例如我们可以使用LU分解矩阵求解原线性系统
A\b的值与Alu\b的值相同
det(A)约等于det(Alu)
2. QR分解
A = QR. 此处Q是酉矩阵/正交矩阵
Aqr = qrfact(A) # in julia 1.0, qr(A)
Q = Aqr[:Q] # in julia 1.0, Q = Aqr.Q
R = Aqr[:R] # in julia 1.0, R = Aqr.R
3. 特征值分解: Eigendecompositions
Asym = copy(A)
AsymEig = eigfact(Asym) # in julia 1.0, eig(Asym)
特征值与特征向量可以通过下面的命令获得
AsymEig[:values] # in julia 1.0, AsymEig.values
AsymEig[:vectors] # in julia 1.0, AsymEig.vectors
# 这里要注意一下:inv(AsymEig)*Asym = I
4. 特殊矩阵构造
在线性代数中,矩阵构造非常重要。
n = 1000
A = randn(n,n) # randn:生成正太随机数,均值为0,标准差为1.
Asym = A +A' # A+A'是对称矩阵
issymmetric(Asym) # 返回值true
但有时会产生浮点错误
Asym_noisy = copy(Asym)
Asym_noisy[1,2] += eps()
issymmetric(Asym_noisy) # 返回值false
我们还可以显式地声明下面地矩阵:Diagonal(对角矩阵),Symmetric(对称矩阵),Hermitian(埃尔米特矩阵)
Tridiagonal(三对角矩阵),SymTridiagonal(对称三角矩阵)[SymTridiagonal只能作用于对称矩阵]
n = 6
A = randn(n,n)
B = Symmetric(A)
B = Hermitian(A)
B = Tridiagonal(A)
B = SymTridiagonal(A+A')
# 接下来我们看一下求解Asym矩阵和Asym_noisy矩阵特征值的时间
@time eigvals(Asym); eigmax(Asym) # 求取最大特征值
@time eigvals(Asym_noisy);
LowerTriangular(A) # 返回矩阵A的下三角矩阵
UpperTriangular(A) # 返回矩阵A的上三角矩阵
Diagonal(A) # 返回矩阵A的对角矩阵
# 这里注意一下,求取特征值和特征向量有两种方法
eigvals(A) = eigfact(A)[:values]
eigvecs(A) = eigfact(A)[:vectors]
Julia:基本线性代数--函数使用方法
最新推荐文章于 2024-09-27 16:17:51 发布