zusätzliche Matrix-Typen
AbstractMatrix: genauso verwendbar, wie andere MatrizenTridiagonalSymTridiagonalSymmetricUpperTriangularArithmetik: Matrixmultiplikation, inv, det, exp
Lineare Gleichungssysteme: \
Matrixfaktorisierungen
LUQRCholeskySVDEigenwerte/-vektoren
eigen, eigvals, eigvecsusing 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