5
5
for elty in (Float32, Float64, Complex64, Complex128)
6
6
a = convert(Matrix{elty}, a)
7
asym = a' + a # symmetric indefinite
8
apd = a'*a # symmetric positive-definite
7
asym = a' + a # symmetric indefinite
8
apd = a'*a # symmetric positive-definite
9
9
b = convert(Vector{elty}, b)
11
capd = chold(apd) # upper Cholesky factor
11
capd = cholfact(apd) # upper Cholesky factor
13
13
@assert_approx_eq r'*r apd
14
14
@assert_approx_eq b apd * (capd\b)
15
15
@assert_approx_eq apd * inv(capd) eye(elty, n)
16
@assert_approx_eq a*(capd\(a'*b)) b # least squares soln for square a
16
@assert_approx_eq a*(capd\(a'*b)) b # least squares soln for square a
17
17
@assert_approx_eq det(capd) det(apd)
19
l = factors(chold(apd, 'L')) # lower Cholesky factor
19
l = factors(cholfact(apd, 'L')) # lower Cholesky factor
20
20
@assert_approx_eq l*l' apd
22
cpapd = cholpd(apd) # pivoted Choleksy decomposition
22
cpapd = cholpfact(apd) # pivoted Choleksy decomposition
23
23
@test rank(cpapd) == n
24
@test all(diff(diag(real(cpapd.LR))).<=0.) # diagonal show be non-increasing
24
@test all(diff(diag(real(cpapd.LR))).<=0.) # diagonal should be non-increasing
25
25
@assert_approx_eq b apd * (cpapd\b)
26
26
@assert_approx_eq apd * inv(cpapd) eye(elty, n)
28
bc1 = BunchKaufman(asym) # Bunch-Kaufman factor of indefinite matrix
28
bc1 = BunchKaufman(asym) # Bunch-Kaufman factor of indefinite matrix
29
29
@assert_approx_eq inv(bc1) * asym eye(elty, n)
30
30
@assert_approx_eq asym * (bc1\b) b
31
bc2 = BunchKaufman(apd) # Bunch-Kaufman factors of a pos-def matrix
31
bc2 = BunchKaufman(apd) # Bunch-Kaufman factors of a pos-def matrix
32
32
@assert_approx_eq inv(bc2) * apd eye(elty, n)
33
33
@assert_approx_eq apd * (bc2\b) b
35
lua = lud(a) # LU decomposition
35
lua = lufact(a) # LU decomposition
37
37
L,U,P = factors(lua)
38
38
@test l == L && u == U && p == P
41
41
@assert_approx_eq a * inv(lua) eye(elty, n)
42
42
@assert_approx_eq a*(lua\b) b
44
qra = qrd(a) # QR decomposition
44
qra = qrfact(a) # QR decomposition
46
46
@assert_approx_eq q'*q eye(elty, n)
47
47
@assert_approx_eq q*q' eye(elty, n)
49
49
@test q == Q && r == R
50
50
@assert_approx_eq q*r a
51
@assert_approx_eq qra*b Q*b
52
@assert_approx_eq qra'*b Q'*b
51
@assert_approx_eq qmulQR(qra,b) Q*b
52
@assert_approx_eq qTmulQR(qra,b) Q'*b
53
53
@assert_approx_eq a*(qra\b) b
55
qrpa = qrpd(a) # pivoted QR decomposition
55
qrpa = qrpfact(a) # pivoted QR decomposition
56
56
q,r,p = factors(qrpa)
57
57
@assert_approx_eq q'*q eye(elty, n)
58
58
@assert_approx_eq q*q' eye(elty, n)
62
62
@assert_approx_eq q*r[:,invperm(p)] a
63
63
@assert_approx_eq a*(qrpa\b) b
65
d,v = eig(asym) # symmetric eigen-decomposition
65
d,v = eig(asym) # symmetric eigen-decomposition
66
66
@assert_approx_eq asym*v[:,1] d[1]*v[:,1]
67
67
@assert_approx_eq v*diagmm(d,v') asym
69
d,v = eig(a) # non-symmetric eigen decomposition
69
d,v = eig(a) # non-symmetric eigen decomposition
70
70
for i in 1:size(a,2) @assert_approx_eq a*v[:,i] d[i]*v[:,i] end
72
u, q, v = schur(a) # Schur
72
u, q, v = schur(a) # Schur
73
73
@assert_approx_eq q*u*q' a
74
74
@assert_approx_eq sort(real(v)) sort(real(d))
75
75
@assert_approx_eq sort(imag(v)) sort(imag(d))
76
76
@test istriu(u) || isreal(a)
78
u,s,vt = svdt(a) # singular value decomposition
78
u,s,vt = svdt(a) # singular value decomposition
79
79
@assert_approx_eq u*diagmm(s,vt) a
81
gsvd = svd(a,a[1:5,:]) # Generalized svd
82
@assert_approx_eq gsvd[1]*gsvd[4]*gsvd[6]*gsvd[3]' a
83
@assert_approx_eq gsvd[2]*gsvd[5]*gsvd[6]*gsvd[3]' a[1:5,:]
82
86
@assert_approx_eq a*x b
88
92
@assert_approx_eq tril(a)*x b
91
95
a15null = null(a[:,1:5]')
92
96
@assert_approx_eq_eps norm(a[:,1:5]'a15null) zero(elty) n*eps(one(elty))
93
97
@assert_approx_eq_eps norm(a15null'a[:,1:5]) zero(elty) n*eps(one(elty))
94
98
@test size(null(b), 2) == 0
97
101
pinva15 = pinv(a[:,1:5])
98
102
@assert_approx_eq a[:,1:5]*pinva15*a[:,1:5] a[:,1:5]
99
103
@assert_approx_eq pinva15*a[:,1:5]*pinva15 pinva15
101
# Complex complex rhs real lhs
103
107
@assert_approx_eq a*x complex(b)
106
110
@assert_approx_eq_eps cond(a, 1) 4.837320054554436e+02 0.01
107
111
@assert_approx_eq_eps cond(a, 2) 1.960057871514615e+02 0.01
108
112
@assert_approx_eq_eps cond(a, Inf) 3.757017682707787e+02 0.01
109
113
@assert_approx_eq_eps cond(a[:,1:5]) 10.233059337453463 0.01
113
117
@assert_approx_eq asq*asq a
120
## Least squares solutions
115
121
a = [ones(20) 1:20 1:20]
116
122
b = reshape(eye(8, 5), 20, 2)
117
123
for elty in (Float32, Float64, Complex64, Complex128)
118
124
a = convert(Matrix{elty}, a)
119
125
b = convert(Matrix{elty}, b)
121
# Matrix and vector multiplication
122
@assert_approx_eq b'b convert(Matrix{elty}, [3 0; 0 2])
123
@assert_approx_eq b'b[:,1] convert(Vector{elty}, [3, 0])
124
@assert_approx_eq dot(b[:,1], b[:,1]) convert(elty, 3.0)
127
x = a[:,1:2]\b[:,1] # Vector rhs
127
x = a[:,1:2]\b[:,1] # Vector rhs
128
128
@assert_approx_eq ((a[:,1:2]*x-b[:,1])'*(a[:,1:2]*x-b[:,1]))[1] convert(elty, 2.546616541353384)
130
x = a[:,1:2]\b # Matrix rhs
130
x = a[:,1:2]\b # Matrix rhs
131
131
@assert_approx_eq det((a[:,1:2]*x-b)'*(a[:,1:2]*x-b)) convert(elty, 4.437969924812031)
133
x = a\b # Rank deficient
133
x = a\b # Rank deficient
134
134
@assert_approx_eq det((a*x-b)'*(a*x-b)) convert(elty, 4.437969924812031)
136
x = convert(Matrix{elty}, [1 0 0; 0 1 -1]) \ convert(Vector{elty}, [1,1]) # Underdetermined minimum norm
136
# Underdetermined minimum norm
137
x = convert(Matrix{elty}, [1 0 0; 0 1 -1]) \ convert(Vector{elty}, [1,1])
137
138
@assert_approx_eq x convert(Vector{elty}, [1, 0.5, -0.5])
139
# symmetric, positive definite
140
# symmetric, positive definite
140
141
@assert_approx_eq inv(convert(Matrix{elty}, [6. 2; 2 1])) convert(Matrix{elty}, [0.5 -1; -1 3])
141
# symmetric, negative definite
142
# symmetric, negative definite
142
143
@assert_approx_eq inv(convert(Matrix{elty}, [1. 2; 2 1])) convert(Matrix{elty}, [-1. 2; 2 -1]/3)
145
146
## Test Julia fallbacks to BLAS routines
146
# matrices with zero dimensions
147
# matrices with zero dimensions
147
148
@test ones(0,5)*ones(5,3) == zeros(0,3)
148
149
@test ones(3,5)*ones(5,0) == zeros(3,0)
149
150
@test ones(3,0)*ones(0,4) == zeros(3,4)
189
190
B = rand(1:20, 5, 5) - 10
190
191
@test At_mul_B(A, B) == A'*B
191
192
@test A_mul_Bt(A, B) == A*B'
193
194
C = Array(Int, size(A, 1), size(B, 2))
194
195
@test A_mul_B(C, A, B) == A*B
195
196
@test At_mul_B(C, A, B) == A'*B
196
197
@test A_mul_Bt(C, A, B) == A*B'
197
198
@test At_mul_Bt(C, A, B) == A'*B'
198
# matrix algebra with subarrays of floats (stride != 1)
199
# matrix algebra with subarrays of floats (stride != 1)
199
200
A = reshape(float64(1:20),5,4)
200
201
Aref = A[1:2:end,1:2:end]
201
202
Asub = sub(A, 1:2:5, 1:2:4)
247
248
0.135335281175235 0.406005843524598 0.541341126763207]')
248
249
@assert_approx_eq expm(A3) eA3
251
252
@assert_approx_eq hess(A1) convert(Matrix{elty},
252
253
[4.000000000000000 -1.414213562373094 -1.414213562373095
253
254
-1.414213562373095 4.999999999999996 -0.000000000000000
254
255
0 -0.000000000000002 3.000000000000000])
257
# matmul for types w/o sizeof (issue #1282)
258
# matmul for types w/o sizeof (issue #1282)
258
259
A = Array(ComplexPair{Int},10,10)
259
260
A[:] = complex(1,1)
261
262
@test A2[1,1] == 20im
263
# basic tridiagonal operations
264
# basic tridiagonal operations
294
294
@assert_approx_eq solve(T,v) invFv
295
295
B = convert(Matrix{elty}, B)
296
296
@assert_approx_eq solve(T, B) F\B
299
299
@assert_approx_eq x invFv
300
300
@assert_approx_eq det(T) det(F)
302
# symmetric tridiagonal
301
# symmetric tridiagonal
303
302
Ts = SymTridiagonal(d, dl)
306
305
Tldlt = ldltd(Ts)
308
307
@assert_approx_eq x invFsv
310
# eigenvalues/eigenvectors of symmetric tridiagonal
308
# eigenvalues/eigenvectors of symmetric tridiagonal
311
309
if elty === Float32 || elty === Float64
313
311
D, Vecs = eig(Fs)
314
312
@assert_approx_eq DT D
315
313
@assert_approx_eq abs(VT'Vecs) eye(elty, n)
319
316
U = convert(Matrix{elty}, U)
320
317
V = convert(Matrix{elty}, V)
321
318
C = convert(Matrix{elty}, C)