Jump to content

QR decomposition: Difference between revisions

→‎Library QR, gonum/matrix: update for library changes, also reorganize code a bit.
(→‎{{header|Go}}: add gonum/matrix solution)
(→‎Library QR, gonum/matrix: update for library changes, also reorganize code a bit.)
Line 1,116:
 
===Library QR, gonum/matrix===
<lang go>packageimport main(
 
import (
"fmt"
 
Line 1,132 ⟶ 1,130:
})
f := mat64.QR(a)
fmt.Printf("q:\n %.3f\n\n", M{mat64.Formatted(f.Q()}, mat64.Prefix(" ")))
fmt.Printf("r:\n %.3f\n\n", M{mat64.Formatted(f.R()}, mat64.Prefix(" ")))
 
// task 2: use qr decomp for polynomial regression example
x := mat64.NewDense(11[]float64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
y := []float64{01, 16, 217, 334, 457, 586, 6121, 7162, 8209, 9262, 10321})
ya := mat64.NewDenseVandermonde(11x, 1,2)
fb := mat64.QRNewDense(a11, 1, y)
[]float64{1, 6, 17, 34, 57, 86, 121, 162, 209, 262, 321})
fmt.Printf("polyfit:\n %.3f\n", M{polyfit(x, y, 2)})
mat64.Formatted(mat64.QR(a).Solve(b), mat64.Prefix(" ")))
}
 
func polyfitVandermonde(x, ya *mat64.Dense[]float64, ndegree int) *mat64.Dense {
m, _x := xmat64.DimsNewDense(len(a), degree+1, nil)
afor i := mat64.NewDense(m,range n+1,a nil){
for ij, p := 0, 1.; ij <= mdegree; i+j, p = j+1, p*a[i] {
v := 1 x.Set(i, j, p)
a.Set(i, 0, v)
i1 := float64(i)
for j := 1; j <= n; j++ {
v *= i1
a.Set(i, j, v)
}
}
return f.Solve(y)x
f := mat64.QR(a)
}</lang>
return f.Solve(y)
}
 
type M struct{ mat64.Matrix }
 
func (m M) Format(f fmt.State, c rune) { mat64.Format(m, 0, 0, f, c) }</lang>
{{out}}
<pre>
q: ⎡-0.857 0.394 -0.331⎤
q:
-0.857 429 -0.394903 -0.331⎤034⎥
⎢-0.429286 -0.903 171 -0.034⎥943⎦
⎣ 0.286 -0.171 -0.943⎦
 
r: 0-14.000 0-21.000 3514.000⎦000⎤
r:
-14 ⎢ 0.000 -21175.000 1470.000⎤000⎥
0.000 -175 0.000 7035.000⎥000⎦
⎣ 0.000 0.000 35.000⎦
 
polyfit: ⎡1.000⎤
v *= i1⎢2.000⎥
⎡1.000⎤
⎣3.000⎦
⎢2.000⎥
⎣3.000⎦
</pre>
 
1,707

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.