Demonstrate Gaussian Elimination (page 51 of GS)
(Reminder: Julia programming syntax will not be tested in this class, but that doesn't mean you can't learn from watching the code being executed)
using Plots
# nice viz for matrices
function lookat(A; redrow=0, rounding=2, showtext=true)
n = size(A,1)
plot(legend=false, axis=false)
rowcolor = redrow > 0 ? :red : :black
for i=1:n, j=1:n
scatter!( [j],[i], ann= showtext ? (j,i,round(A[i,j],digits=rounding), :white ) : (j,i,"") ,
color=abs(A[i,j]) > .0001 ? (i==redrow ? rowcolor : :black) : :white,
marker=:square, markersize=30, aspectratio=1, yflip=true, yaxis=[.5,n+.5],xaxis=[.5,n+.5])
end
plot!()
end
lookat (generic function with 1 method)
A = [2 12 4 7; 29 12 69 24 ; 7 7 7 7; 3 7 5 2]
A = A*1.0
4×4 Array{Float64,2}: 2.0 12.0 4.0 7.0 29.0 12.0 69.0 24.0 7.0 7.0 7.0 7.0 3.0 7.0 5.0 2.0
lookat(A)
L = fill(0.0, 4,4)
4×4 Array{Float64,2}: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
L[2,1] = A[2,1]/A[1,1]
14.5
A[2,:] -= L[2,1]*A[1,:]; # subtract the multiplier times the first row from the second row
lookat(A, redrow=2)
L[3,1] = A[3,1]/A[1,1] # the diagonal entry that we divide by is called the "pivot"
3.5
A[3,:] -= L[3,1]*A[1,:]; # subtract the multiplier times the first row from the second row
lookat(A, redrow=3)
L[4,1] = A[4,1]/A[1,1]
A[4,:] -= L[4,1]*A[1,:]; # subtract the multiplier times the first row from the second row
lookat(A, redrow=4)
L[3,2] = A[3,2]/A[2,2]
A[3,:] -= L[3,2]*A[2,:]; # subtract the multiplier times the first row from the second row
lookat(A, redrow=3)
L[4,2] = A[4,2]/A[2,2]
A[4,:] -= L[4,2]*A[2,:]; # subtract the multiplier times the first row from the second row
lookat(A, redrow=4)
L[4,3] = A[4,3]/A[3,3]
A[4,:] -= L[4,3]*A[3,:]; # subtract the multiplier times the first row from the second row
lookat(A, redrow=4)
n = 6
A = rand(n,n)
keepA = [copy(A)]
row = [0]
L = fill(0.0,n,n)
for j=1:n, i=j+1:n
L[i,j] = A[i,j] / A[j,j]
A[i,:] -= L[i,j] * A[j,:]
push!(keepA,copy(A))
push!(row,i)
end
using Interact
@manipulate for i =1: length(keepA)
lookat( keepA[i], redrow=row[i])
end
using LinearAlgebra
A = keepA[1]
6×6 Array{Float64,2}: 0.601848 0.719816 0.0549105 0.664714 0.184826 0.856158 0.373551 0.503678 0.964187 0.613921 0.840482 0.349087 0.139154 0.146278 0.0863354 0.315124 0.982249 0.226666 0.176656 0.560782 0.473594 0.625323 0.164821 0.457171 0.919038 0.751709 0.0796167 0.569861 0.793574 0.418587 0.288685 0.0699438 0.0534446 0.0420711 0.788685 0.921932
U = keepA[end]
6×6 Array{Float64,2}: 0.601848 0.719816 0.0549105 0.664714 0.184826 0.856158 -5.55112e-17 0.0569073 0.930105 0.201351 0.725765 -0.182307 -1.96573e-17 0.0 0.403003 0.232736 1.19652 -0.0358447 8.46105e-17 0.0 0.0 2.22829 11.2549 0.858134 3.25219e-17 0.0 0.0 0.0 0.685981 -0.537103 3.55852e-18 0.0 0.0 0.0 -5.55112e-17 1.1249
L
6×6 Array{Float64,2}: 0.0 0.0 0.0 0.0 0.0 0.0 0.620673 0.0 0.0 0.0 0.0 0.0 0.231211 -0.354114 0.0 0.0 0.0 0.0 0.293522 6.14156 -13.0392 0.0 0.0 0.0 1.52703 -6.10589 14.0815 -1.11881 0.0 0.0 0.479664 -4.83816 11.2334 -0.860311 0.660471 0.0
L += I
6×6 Array{Float64,2}: 1.0 0.0 0.0 0.0 0.0 0.0 0.620673 1.0 0.0 0.0 0.0 0.0 0.231211 -0.354114 1.0 0.0 0.0 0.0 0.293522 6.14156 -13.0392 1.0 0.0 0.0 1.52703 -6.10589 14.0815 -1.11881 1.0 0.0 0.479664 -4.83816 11.2334 -0.860311 0.660471 1.0
A
6×6 Array{Float64,2}: 0.601848 0.719816 0.0549105 0.664714 0.184826 0.856158 0.373551 0.503678 0.964187 0.613921 0.840482 0.349087 0.139154 0.146278 0.0863354 0.315124 0.982249 0.226666 0.176656 0.560782 0.473594 0.625323 0.164821 0.457171 0.919038 0.751709 0.0796167 0.569861 0.793574 0.418587 0.288685 0.0699438 0.0534446 0.0420711 0.788685 0.921932
L * U
6×6 Array{Float64,2}: 0.601848 0.719816 0.0549105 0.664714 0.184826 0.856158 0.373551 0.503678 0.964187 0.613921 0.840482 0.349087 0.139154 0.146278 0.0863354 0.315124 0.982249 0.226666 0.176656 0.560782 0.473594 0.625323 0.164821 0.457171 0.919038 0.751709 0.0796167 0.569861 0.793574 0.418587 0.288685 0.0699438 0.0534446 0.0420711 0.788685 0.921932
A ≈ L * U
true
A = [2 12 4 7; 29 12 69 24 ; 7 7 7 7; 3 7 5 2]
4×4 Array{Int64,2}: 2 12 4 7 29 12 69 24 7 7 7 7 3 7 5 2
A'
4×4 Adjoint{Int64,Array{Int64,2}}: 2 29 7 3 12 12 7 7 4 69 7 5 7 24 7 2
A= [ 1 2 3; 4 5 6]
2×3 Array{Int64,2}: 1 2 3 4 5 6
A'
3×2 Adjoint{Int64,Array{Int64,2}}: 1 4 2 5 3 6
dump(A')
Adjoint{Int64,Array{Int64,2}} parent: Array{Int64}((2, 3)) [1 2 3; 4 5 6]
A = rand( 1:9, 2,3,4)
2×3×4 Array{Int64,3}: [:, :, 1] = 2 8 3 7 5 3 [:, :, 2] = 7 5 8 3 4 5 [:, :, 3] = 4 2 8 8 4 2 [:, :, 4] = 8 3 8 7 4 9
permutedims(A, [3 2 1])
4×3×2 Array{Int64,3}: [:, :, 1] = 2 8 3 7 5 8 4 2 8 8 3 8 [:, :, 2] = 7 5 3 3 4 5 8 4 2 7 4 9
inv( rand(4,6))
DimensionMismatch("matrix is not square: dimensions are (4, 6)") Stacktrace: [1] inv(::Array{Float64,2}) at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.3/LinearAlgebra/src/LinearAlgebra.jl:221 [2] top-level scope at In[47]:1
A = rand(3,3)
3×3 Array{Float64,2}: 0.961711 0.705796 0.334855 0.825322 0.76569 0.0211825 0.22131 0.162853 0.357397
B = rand(3,3)
3×3 Array{Float64,2}: 0.466144 0.282758 0.176453 0.804355 0.748308 0.9467 0.764508 0.457893 0.0473501
inv( A*B )
3×3 Array{Float64,2}: 110.378 -81.0345 -112.35 -191.261 138.822 201.288 50.3087 -34.295 -57.3957
inv(B) * inv(A)
3×3 Array{Float64,2}: 110.378 -81.0345 -112.35 -191.261 138.822 201.288 50.3087 -34.295 -57.3957
x = 1:10
1:10
x * x'
10×10 Array{Int64,2}: 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100
x =[ 1 ,2 ,4, 5]
4-element Array{Int64,1}: 1 2 4 5
y = [ 2, 4, 6]
3-element Array{Int64,1}: 2 4 6
x * y'
4×3 Array{Int64,2}: 2 4 6 4 8 12 8 16 24 10 20 30