zusätzliche Matrix-Typen
AbstractMatrix
: genauso verwendbar, wie andere MatrizenTridiagonal
SymTridiagonal
Symmetric
UpperTriangular
Arithmetik: Matrixmultiplikation, inv
, det
, exp
Lineare Gleichungssysteme: \
Matrixfaktorisierungen
LU
QR
Cholesky
SVD
Eigenwerte/-vektoren
eigen
, eigvals
, eigvecs
using LinearAlgebra
A = SymTridiagonal(fill(1.0, 4), fill(-0.3, 3))
4×4 SymTridiagonal{Float64, Vector{Float64}}: 1.0 -0.3 ⋅ ⋅ -0.3 1.0 -0.3 ⋅ ⋅ -0.3 1.0 -0.3 ⋅ ⋅ -0.3 1.0
B = UpperTriangular(A)
4×4 UpperTriangular{Float64, SymTridiagonal{Float64, Vector{Float64}}}: 1.0 -0.3 0.0 0.0 ⋅ 1.0 -0.3 0.0 ⋅ ⋅ 1.0 -0.3 ⋅ ⋅ ⋅ 1.0
A + B
4×4 Matrix{Float64}: 2.0 -0.6 0.0 0.0 -0.3 2.0 -0.6 0.0 0.0 -0.3 2.0 -0.6 0.0 0.0 -0.3 2.0
I
¶I
bezeichnet eine Einheitsmatrix (quadratisch, Diagonalelemente = 1, alle anderen = 0) in der jeweils erforderlichen Größe
A + 4I
4×4 SymTridiagonal{Float64, Vector{Float64}}: 5.0 -0.3 ⋅ ⋅ -0.3 5.0 -0.3 ⋅ ⋅ -0.3 5.0 -0.3 ⋅ ⋅ -0.3 5.0
A = [0 22 1.
-1 2 3
77 18 19]
3×3 Matrix{Float64}: 0.0 22.0 1.0 -1.0 2.0 3.0 77.0 18.0 19.0
# Faktorisierungen geben eine spezielle Struktur zurück, die die Matrixfaktoren und weitere
# Informationen enthalten:
Af = lu(A);
@show Af.L Af.U Af.p;
Af.L = [1.0 0.0 0.0; 0.0 1.0 0.0; -0.012987012987012988 0.10153482880755607 1.0] Af.U = [77.0 18.0 19.0; 0.0 22.0 1.0; 0.0 0.0 3.145218417945691] Af.p = [3, 1, 2]
# man kann auch gleich auf der linken Seite ein entsprechendes Tupel verwenden
l,u,p = lu(A)
l
3×3 Matrix{Float64}: 1.0 0.0 0.0 0.0 1.0 0.0 -0.012987 0.101535 1.0
u
3×3 Matrix{Float64}: 77.0 18.0 19.0 0.0 22.0 1.0 0.0 0.0 3.14522
p
3-element Vector{Int64}: 3 1 2
Der Permutationsvektor p
zeigt an, wie die Zeilen der Matrix permutiert wurden:
A[p, :] # 3. Zeile, 1. Zeile, 2. Zeile von A
3×3 Matrix{Float64}: 77.0 18.0 19.0 0.0 22.0 1.0 -1.0 2.0 3.0
Es gilt: $$ L\cdot U = PA$$
l * u - A[p,:]
3×3 Matrix{Float64}: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.22045e-16 0.0
q, r = qr(A);
q
3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}}: 0.0 -0.994886 -0.101007 0.0129859 -0.100999 0.994802 -0.999916 -0.00131167 0.0129195
r
3×3 Matrix{Float64}: -77.0065 -17.9725 -18.9594 0.0 -22.1131 -1.3228 0.0 0.0 3.12887
u, s, vt = svd(A);
s
3-element Vector{Float64}: 81.49863518679489 21.487573868706654 3.0424713518113586
u
3×3 Matrix{Float64}: -0.0672717 -0.992532 -0.101754 -0.00288554 -0.101791 0.994802 -0.997731 0.0672156 0.00398368
vt
3×3 adjoint(::Matrix{Float64}) with eltype Float64: -0.942621 0.245602 -0.226151 -0.238592 -0.96937 -0.0582696 -0.233535 -0.000968442 0.972348
evalues, evectors = eigen(A)
evalues
3-element Vector{ComplexF64}: -4.259744130930172 - 12.741487891217805im -4.259744130930172 + 12.741487891217805im 29.519488261860335 + 0.0im
evectors
3×3 Matrix{ComplexF64}: -0.253921-0.195951im -0.253921+0.195951im -0.110787+0.0im -0.106268+0.185001im -0.106268-0.185001im -0.103725+0.0im 0.922827-0.0im 0.922827+0.0im -0.988417+0.0im
Das lineare Gleichungssystem $$Ax = b$$ kann man in Julia einfach lösen mit
x = A\b
b = [2,3,4]
A\b
3-element Vector{Float64}: -0.18318318318318316 0.04973723723723724 0.9057807807807807
Dabei wird eine geeignete Matrixfaktorisierung vorgenommen (meist LU). Wenn man Lösungen zu mehreren rechten Seiten $b_1, b_2,...$ benötigt, sollte man die Faktorisierung nur einmal durchführen:
Af = factorize(A)
LU{Float64, Matrix{Float64}} L factor: 3×3 Matrix{Float64}: 1.0 0.0 0.0 0.0 1.0 0.0 -0.012987 0.101535 1.0 U factor: 3×3 Matrix{Float64}: 77.0 18.0 19.0 0.0 22.0 1.0 0.0 0.0 3.14522
Af\b
3-element Vector{Float64}: -0.18318318318318316 0.04973723723723724 0.9057807807807807
Af\[5,7,9]
3-element Vector{Float64}: -0.43243243243243246 0.13175675675675677 2.1013513513513513