Julia中的基本线性代数
首先让定义一个随机矩阵
A = rand(1:4,3,3)
定义一个向量
x=fill(1.0,(3,)) # =fill(1.0,3)
请注意 许多基本操作与其他语言相同
b = A*x
如果我们有一个超定线性系统(一个“高”矩阵),给出了最小二乘解
Atall = rand(3, 2)
Atall\b
如果我们有一个秩缺陷最小二乘问题,那么最小范数的最小二乘解为
v = rand(3)
rankdef = hcat(v, v)
rankdef\b
当我们有一个“短”矩阵时,Julia也给了我们解决方案
bshort = rand(2)
Ashort = rand(2, 3)
Ashort\bshort
LinearAlgebra库
虽然Julia默认提供了很多线性代数(如上所示),但是有一个标准的库LinearAlgebra可以引入更多相关函数。特别是,它提供了分解和一些结构化矩阵类型。与所有软件包一样using LinearAlgebra
试一试喽
用LinearAlgebra引入分解和特殊矩阵结构。
using LinearAlgebra
A = rand(3, 3)
x = fill(1, (3,))
b = A * x
在Julia中,可以执行LU分解
PA = LU
其中P是置换矩阵,L是下三角,U是上三角,使用lufact。
Julia允许计算LU分解并定义用于存储它的复合分解类型。
Alu = lu(A)
typeof(Alu)
可以通过访问其特殊属性来提取分解的不同部分
Alu.P
Alu.L
Alu.U
Julia可以在分解对象上调度方法。
例如,我们可以使用原始矩阵或分解对象来求解线性代数
A\B
Alu\b
QR分解
在Julia,我们可以执行QR分解
A=QR 其中Q是单一的/正交的并且R是上三角 Aqr=qr(A) 类似于LU分解,矩阵Q和R可以从QR因式分解对象通过提取
Aqr.Q
Aqr.R
特殊矩阵
矩阵结构在线性代数中非常重要。了解它的重要性,让我们使用更大的线性代数
n=1000
A=randn(n,n)
朱莉娅会自动推断出特殊的矩阵结构
Asym = A + A'
issymmetric(Asym)
但有浮点数可能会产生错误。
Asym_noisy = copy(Asym)
Asym_noisy[1,2] += 5eps()
issymmetric(Asym_noisy)
幸运的是,我们可以明确地声明参数结构,例如Diagonal,Triangular,Symmetric,Hermitian,Tridiagonal和SymTridiagonal。
Asym_explicit = Symmetric(Asym_noisy);
让我们比较一下朱莉娅计算的不同特征值所花费的时间:用Asym,Asym_noisy和Asym_explicit
@time eigvals(Asym);
@time eigvals(Asym_noisy);
@time eigvals(Asym_explicit);
在这个例子中,使用Symmetric()on Asym_noisy使我们的计算更高效:)
有理数 Julia内置了有理数。要构造有理数,请使用双正斜杠: 1//2 示例:有理线性方程组 以下示例显示了如何在不提升浮点元素类型的情况下求解具有有理元素的线性方程组。使用有理数时,溢出很容易成为问题,所以我们使用BigInts。
Arational = Matrix{Rational{BigInt}}(rand(1:10, 3, 3))/10
x = fill(1, 3)
b = Arational*x
Arational\b
lu(Arational)