@@ -92,9 +92,9 @@ LinearAlgebra.istril(N::NotDiagonal) = istril(N.a)
92
92
@test typeof (convert (Diagonal{ComplexF32},D)) <: Diagonal{ComplexF32}
93
93
@test typeof (convert (AbstractMatrix{ComplexF32},D)) <: Diagonal{ComplexF32}
94
94
95
- @test Array ( real (D)) == real (M)
96
- @test Array ( abs .(D)) == abs .(M)
97
- @test Array ( imag (D)) == imag (M)
95
+ @test convert (Array, real (D)) == real (M)
96
+ @test convert (Array, abs .(D)) == abs .(M)
97
+ @test convert (Array, imag (D)) == imag (M)
98
98
99
99
@test parent (D) == dd
100
100
@test D[1 ,1 ] == dd[1 ]
@@ -170,8 +170,8 @@ LinearAlgebra.istril(N::NotDiagonal) = istril(N.a)
170
170
@test D* v ≈ DM* v atol= n* eps (relty)* (1 + (elty<: Complex ))
171
171
@test D* U ≈ DM* U atol= n^ 2 * eps (relty)* (1 + (elty<: Complex ))
172
172
173
- @test transpose (U)* D ≈ transpose (U)* Array (D)
174
- @test U' * D ≈ U' * Array (D)
173
+ @test transpose (U)* D ≈ transpose (U)* M
174
+ @test U' * D ≈ U' * M
175
175
176
176
if relty != BigFloat
177
177
atol_two = 2 n^ 2 * eps (relty) * (1 + (elty <: Complex ))
@@ -206,12 +206,12 @@ LinearAlgebra.istril(N::NotDiagonal) = istril(N.a)
206
206
@test_throws DimensionMismatch ldiv! (D, fill (elty (1 ), n + 1 ))
207
207
@test_throws SingularException ldiv! (Diagonal (zeros (relty, n)), copy (v))
208
208
b = rand (elty, n, n)
209
- @test ldiv! (D, copy (b)) ≈ Array (D) \ Array (b)
209
+ @test ldiv! (D, copy (b)) ≈ M \ b
210
210
@test_throws SingularException ldiv! (Diagonal (zeros (elty, n)), copy (b))
211
211
b = view (rand (elty, n), Vector (1 : n))
212
212
b2 = copy (b)
213
213
c = ldiv! (D, b)
214
- d = Array (D) \ b2
214
+ d = M \ b2
215
215
@test c ≈ d
216
216
@test_throws SingularException ldiv! (Diagonal (zeros (elty, n)), b)
217
217
b = rand (elty, n+ 1 , n+ 1 )
@@ -234,9 +234,9 @@ LinearAlgebra.istril(N::NotDiagonal) = istril(N.a)
234
234
@test Array (D* a) ≈ DM* a
235
235
@test Array (D/ a) ≈ DM/ a
236
236
if elty <: Real
237
- @test Array ( abs .(D)^ a) ≈ abs .(DM)^ a
237
+ @test convert (Array, abs .(D)^ a) ≈ abs .(DM)^ a
238
238
else
239
- @test Array ( D^ a) ≈ DM^ a rtol= max (eps (relty), 1e-15 ) # TODO : improve precision
239
+ @test convert (Array, D^ a) ≈ DM^ a rtol= max (eps (relty), 1e-15 ) # TODO : improve precision
240
240
end
241
241
@test Diagonal (1 : 100 )^ 2 == Diagonal ((1 : 100 ). ^ 2 )
242
242
p = 3
@@ -248,17 +248,17 @@ LinearAlgebra.istril(N::NotDiagonal) = istril(N.a)
248
248
249
249
if relty <: BlasFloat
250
250
for b in (rand (elty,n,n), rand (elty,n))
251
- @test lmul! (copy (D), copy (b)) ≈ Array (D) * Array (b)
252
- @test lmul! (transpose (copy (D)), copy (b)) ≈ transpose (Array (D)) * Array (b)
253
- @test lmul! (adjoint (copy (D)), copy (b)) ≈ Array (D) ' * Array (b)
251
+ @test lmul! (copy (D), copy (b)) ≈ M * b
252
+ @test lmul! (transpose (copy (D)), copy (b)) ≈ transpose (M) * b
253
+ @test lmul! (adjoint (copy (D)), copy (b)) ≈ M ' * b
254
254
end
255
255
end
256
256
257
257
# a few missing mults
258
258
bd = Bidiagonal (D2)
259
- @test D* transpose (D2) ≈ Array (D) * transpose (Array (D2) )
260
- @test D2* transpose (D) ≈ Array (D2) * transpose (Array (D) )
261
- @test D2* D' ≈ Array (D2) * Array (D) '
259
+ @test D* transpose (D2) ≈ M * transpose (DM2 )
260
+ @test D2* transpose (D) ≈ DM2 * transpose (M )
261
+ @test D2* D' ≈ DM2 * M '
262
262
263
263
# division of two Diagonals
264
264
@test D/ D2 ≈ Diagonal (D. diag./ D2. diag)
@@ -273,33 +273,37 @@ LinearAlgebra.istril(N::NotDiagonal) = istril(N.a)
273
273
A = rand (elty, n, n)
274
274
Asym = Symmetric (A + transpose (A), :U )
275
275
Aherm = Hermitian (A + adjoint (A), :U )
276
+ Msym = Array (Asym)
277
+ Mherm = Array (Aherm)
276
278
for op in (+ , - )
277
279
@test op (Asym, D) isa Symmetric
278
- @test Array ( op (Asym, D)) ≈ Array (Symmetric (op (Array (Asym), Array (D) )))
280
+ @test convert (Array, op (Asym, D)) ≈ Array (Symmetric (op (Msym, M )))
279
281
@test op (D, Asym) isa Symmetric
280
- @test Array ( op (D, Asym)) ≈ Array (Symmetric (op (Array (D), Array (Asym) )))
282
+ @test convert (Array, op (D, Asym)) ≈ Array (Symmetric (op (M, Msym )))
281
283
if ! (elty <: Real )
282
284
Dr = real (D)
285
+ Mr = Array (Dr)
283
286
@test op (Aherm, Dr) isa Hermitian
284
- @test Array ( op (Aherm, Dr)) ≈ Array (Hermitian (op (Array (Aherm), Array (Dr) )))
287
+ @test convert (Array, op (Aherm, Dr)) ≈ Array (Hermitian (op (Mherm, Mr )))
285
288
@test op (Dr, Aherm) isa Hermitian
286
- @test Array ( op (Dr, Aherm)) ≈ Array (Hermitian (op (Array (Dr), Array (Aherm) )))
289
+ @test convert (Array, op (Dr, Aherm)) ≈ Array (Hermitian (op (Mr, Mherm )))
287
290
end
288
291
end
289
- @test Array (D* transpose (Asym)) ≈ Array (D) * Array (transpose (Asym))
290
- @test Array (D* adjoint (Asym)) ≈ Array (D) * Array (adjoint (Asym))
291
- @test Array (D* transpose (Aherm)) ≈ Array (D) * Array (transpose (Aherm))
292
- @test Array (D* adjoint (Aherm)) ≈ Array (D) * Array (adjoint (Aherm))
293
- @test Array (transpose (Asym)* transpose (D)) ≈ Array (transpose (Asym)) * Array (transpose (D))
294
- @test Array (transpose (D)* transpose (Asym)) ≈ Array (transpose (D)) * Array (transpose (Asym))
295
- @test Array (adjoint (Aherm)* adjoint (D)) ≈ Array (adjoint (Aherm)) * Array (adjoint (D))
296
- @test Array (adjoint (D)* adjoint (Aherm)) ≈ Array (adjoint (D)) * Array (adjoint (Aherm))
292
+ Msym = Array (Asym)
293
+ @test convert (Array, D* transpose (Asym)) ≈ M * convert (Array, transpose (Msym))
294
+ @test convert (Array, D* adjoint (Asym)) ≈ M * convert (Array, adjoint (Asym))
295
+ @test convert (Array, D* transpose (Aherm)) ≈ M * convert (Array, transpose (Aherm))
296
+ @test convert (Array, D* adjoint (Aherm)) ≈ M * convert (Array, adjoint (Aherm))
297
+ @test convert (Array, Asym* transpose (D)) ≈ Msym * convert (Array, transpose (D))
298
+ @test convert (Array, transpose (D)* Asym) ≈ convert (Array, transpose (D)) * Msym
299
+ @test convert (Array, adjoint (Aherm)* adjoint (D)) ≈ convert (Array, adjoint (Aherm)) * convert (Array, adjoint (D))
300
+ @test convert (Array, adjoint (D)* adjoint (Aherm)) ≈ convert (Array, adjoint (D)) * convert (Array, adjoint (Aherm))
297
301
298
302
# Performance specialisations for A*_mul_B!
299
303
vvv = similar (vv)
300
- @test (r = Matrix (D) * vv ; mul! (vvv, D, vv) ≈ r ≈ vvv)
301
- @test (r = Matrix (D) ' * vv ; mul! (vvv, adjoint (D), vv) ≈ r ≈ vvv)
302
- @test (r = transpose (Matrix (D) ) * vv ; mul! (vvv, transpose (D), vv) ≈ r ≈ vvv)
304
+ @test (r = M * vv ; mul! (vvv, D, vv) ≈ r ≈ vvv)
305
+ @test (r = M ' * vv ; mul! (vvv, adjoint (D), vv) ≈ r ≈ vvv)
306
+ @test (r = transpose (M ) * vv ; mul! (vvv, transpose (D), vv) ≈ r ≈ vvv)
303
307
304
308
UUU = similar (UU)
305
309
for transformA in (identity, adjoint, transpose)
@@ -311,55 +315,62 @@ LinearAlgebra.istril(N::NotDiagonal) = istril(N.a)
311
315
312
316
alpha = elty (randn ()) # randn(elty) does not work with BigFloat
313
317
beta = elty (randn ())
314
- @test begin
318
+ @testset begin
315
319
vvv = similar (vv)
316
320
vvv .= randn (size (vvv)) # randn!(vvv) does not work with BigFloat
317
- r = alpha * Matrix (D) * vv + beta * vvv
318
- mul! (vvv, D, vv, alpha, beta) ≈ r ≈ vvv
321
+ r = alpha * M * vv + beta * vvv
322
+ @test mul! (vvv, D, vv, alpha, beta) === vvv
323
+ @test r ≈ vvv
319
324
end
320
- @test begin
325
+ @testset begin
321
326
vvv = similar (vv)
322
327
vvv .= randn (size (vvv)) # randn!(vvv) does not work with BigFloat
323
- r = alpha * Matrix (D)' * vv + beta * vvv
324
- mul! (vvv, adjoint (D), vv, alpha, beta) ≈ r ≈ vvv
328
+ r = alpha * M' * vv + beta * vvv
329
+ @test mul! (vvv, adjoint (D), vv, alpha, beta) === vvv
330
+ @test r ≈ vvv
325
331
end
326
- @test begin
332
+ @testset begin
327
333
vvv = similar (vv)
328
334
vvv .= randn (size (vvv)) # randn!(vvv) does not work with BigFloat
329
- r = alpha * transpose (Matrix (D)) * vv + beta * vvv
330
- mul! (vvv, transpose (D), vv, alpha, beta) ≈ r ≈ vvv
335
+ r = alpha * transpose (M) * vv + beta * vvv
336
+ @test mul! (vvv, transpose (D), vv, alpha, beta) === vvv
337
+ @test r ≈ vvv
331
338
end
332
339
333
- @test begin
340
+ @testset begin
334
341
UUU = similar (UU)
335
342
UUU .= randn (size (UUU)) # randn!(UUU) does not work with BigFloat
336
- r = alpha * Matrix (D) * UU + beta * UUU
337
- mul! (UUU, D, UU, alpha, beta) ≈ r ≈ UUU
343
+ r = alpha * M * UU + beta * UUU
344
+ @test mul! (UUU, D, UU, alpha, beta) === UUU
345
+ @test r ≈ UUU
338
346
end
339
- @test begin
347
+ @testset begin
340
348
UUU = similar (UU)
341
349
UUU .= randn (size (UUU)) # randn!(UUU) does not work with BigFloat
342
- r = alpha * Matrix (D)' * UU + beta * UUU
343
- mul! (UUU, adjoint (D), UU, alpha, beta) ≈ r ≈ UUU
350
+ r = alpha * M' * UU + beta * UUU
351
+ @test mul! (UUU, adjoint (D), UU, alpha, beta) === UUU
352
+ @test r ≈ UUU
344
353
end
345
- @test begin
354
+ @testset begin
346
355
UUU = similar (UU)
347
356
UUU .= randn (size (UUU)) # randn!(UUU) does not work with BigFloat
348
- r = alpha * transpose (Matrix (D)) * UU + beta * UUU
349
- mul! (UUU, transpose (D), UU, alpha, beta) ≈ r ≈ UUU
357
+ r = alpha * transpose (M) * UU + beta * UUU
358
+ @test mul! (UUU, transpose (D), UU, alpha, beta) === UUU
359
+ @test r ≈ UUU
350
360
end
351
361
352
362
# make sure that mul!(A, {Adj|Trans}(B)) works with B as a Diagonal
353
363
VV = Array (D)
354
- DD = copy (D)
355
- r = VV * Matrix (D)
356
- @test Array (rmul! (VV, DD)) ≈ r ≈ Array (D)* Array (D)
357
- DD = copy (D)
358
- r = VV * transpose (Array (D))
359
- @test Array (rmul! (VV, transpose (DD))) ≈ r
360
- DD = copy (D)
361
- r = VV * Array (D)'
362
- @test Array (rmul! (VV, adjoint (DD))) ≈ r
364
+ r = VV * M
365
+ @test rmul! (VV, D) ≈ r ≈ M* M
366
+ if transpose (D) != = D
367
+ r = VV * transpose (M)
368
+ @test rmul! (VV, transpose (D)) ≈ r
369
+ end
370
+ if adjoint (D) != = D
371
+ r = VV * M'
372
+ @test rmul! (VV, adjoint (D)) ≈ r
373
+ end
363
374
364
375
# kron
365
376
D3 = Diagonal (convert (Vector{elty}, rand (n÷ 2 )))
@@ -537,16 +548,17 @@ Base.size(x::SimpleVector) = size(x.vec)
537
548
538
549
@testset " kron (issue #46456)" for repr in Any[identity, SimpleVector]
539
550
A = Diagonal (repr (randn (10 )))
551
+ M = Array (A)
540
552
BL = Bidiagonal (repr (randn (10 )), repr (randn (9 )), :L )
541
553
BU = Bidiagonal (repr (randn (10 )), repr (randn (9 )), :U )
542
554
C = SymTridiagonal (repr (randn (10 )), repr (randn (9 )))
543
555
Cl = SymTridiagonal (repr (randn (10 )), repr (randn (10 )))
544
556
D = Tridiagonal (repr (randn (9 )), repr (randn (10 )), repr (randn (9 )))
545
- @test kron (A, BL):: Bidiagonal == kron (Array (A) , Array (BL))
546
- @test kron (A, BU):: Bidiagonal == kron (Array (A) , Array (BU))
547
- @test kron (A, C):: SymTridiagonal == kron (Array (A) , Array (C))
548
- @test kron (A, Cl):: SymTridiagonal == kron (Array (A) , Array (Cl))
549
- @test kron (A, D):: Tridiagonal == kron (Array (A) , Array (D))
557
+ @test kron (A, BL):: Bidiagonal == kron (M , Array (BL))
558
+ @test kron (A, BU):: Bidiagonal == kron (M , Array (BU))
559
+ @test kron (A, C):: SymTridiagonal == kron (M , Array (C))
560
+ @test kron (A, Cl):: SymTridiagonal == kron (M , Array (Cl))
561
+ @test kron (A, D):: Tridiagonal == kron (M , Array (D))
550
562
end
551
563
552
564
@testset " svdvals and eigvals (#11120/#11247)" begin
619
631
620
632
@testset " Test reverse" begin
621
633
D = Diagonal (randn (5 ))
622
- @test reverse (D, dims= 1 ) == reverse (Matrix (D), dims= 1 )
623
- @test reverse (D, dims= 2 ) == reverse (Matrix (D), dims= 2 )
624
- @test reverse (D):: Diagonal == reverse (Matrix (D))
634
+ M = Matrix (D)
635
+ @test reverse (D, dims= 1 ) == reverse (M, dims= 1 )
636
+ @test reverse (D, dims= 2 ) == reverse (M, dims= 2 )
637
+ @test reverse (D):: Diagonal == reverse (M)
625
638
end
626
639
627
640
@testset " inverse" begin
637
650
@testset " pseudoinverse" begin
638
651
for d in Any[randn (n), zeros (n), Int[], [0 , 2 , 0.003 ], [0im , 1 + 2im , 0.003im ], [0 // 1 , 2 // 1 , 3 // 100 ], [0 // 1 , 1 // 1 + 2im , 3im // 100 ]]
639
652
D = Diagonal (d)
640
- @test pinv (D) ≈ pinv (Array (D))
641
- @test pinv (D, 1.0e-2 ) ≈ pinv (Array (D), 1.0e-2 )
653
+ M = Array (D)
654
+ @test pinv (D) ≈ pinv (M)
655
+ @test pinv (D, 1.0e-2 ) ≈ pinv (M, 1.0e-2 )
642
656
end
643
657
end
644
658
@@ -654,51 +668,54 @@ end
654
668
@test Matrix (1.0 I, 5 , 5 ) \ Diagonal (fill (1. ,5 )) == Matrix (I, 5 , 5 )
655
669
656
670
@testset " Triangular and Diagonal" begin
657
- function _test_matrix (type)
671
+ function _randomarray (type, :: Val{N} = Val (2 )) where {N}
672
+ sz = ntuple (_-> 5 , N)
658
673
if type == Int
659
- return rand (1 : 9 , 5 , 5 )
674
+ return rand (1 : 9 , sz ... )
660
675
else
661
- return randn (type, 5 , 5 )
676
+ return randn (type, sz ... )
662
677
end
663
678
end
664
679
types = (Float64, Int, ComplexF64)
665
680
for ta in types
666
- D = Diagonal (_test_matrix (ta))
681
+ D = Diagonal (_randomarray (ta, Val (1 )))
682
+ M = Matrix (D)
667
683
for tb in types
668
- B = _test_matrix (tb)
684
+ B = _randomarray (tb, Val ( 2 ) )
669
685
Tmats = (LowerTriangular (B), UnitLowerTriangular (B), UpperTriangular (B), UnitUpperTriangular (B))
670
686
restypes = (LowerTriangular, LowerTriangular, UpperTriangular, UpperTriangular)
671
687
for (T, rtype) in zip (Tmats, restypes)
672
688
adjtype = (rtype == LowerTriangular) ? UpperTriangular : LowerTriangular
673
689
674
690
# Triangular * Diagonal
675
691
R = T * D
676
- @test R ≈ Array (T) * Array (D)
692
+ TA = Array (T)
693
+ @test R ≈ TA * M
677
694
@test isa (R, rtype)
678
695
679
696
# Diagonal * Triangular
680
697
R = D * T
681
- @test R ≈ Array (D) * Array (T)
698
+ @test R ≈ M * TA
682
699
@test isa (R, rtype)
683
700
684
701
# Adjoint of Triangular * Diagonal
685
702
R = T' * D
686
- @test R ≈ Array (T) ' * Array (D)
703
+ @test R ≈ TA ' * M
687
704
@test isa (R, adjtype)
688
705
689
706
# Diagonal * Adjoint of Triangular
690
707
R = D * T'
691
- @test R ≈ Array (D) * Array (T) '
708
+ @test R ≈ M * TA '
692
709
@test isa (R, adjtype)
693
710
694
711
# Transpose of Triangular * Diagonal
695
712
R = transpose (T) * D
696
- @test R ≈ transpose (Array (T)) * Array (D)
713
+ @test R ≈ transpose (TA) * M
697
714
@test isa (R, adjtype)
698
715
699
716
# Diagonal * Transpose of Triangular
700
717
R = D * transpose (T)
701
- @test R ≈ Array (D) * transpose (Array (T) )
718
+ @test R ≈ M * transpose (TA )
702
719
@test isa (R, adjtype)
703
720
end
704
721
end
@@ -1325,7 +1342,7 @@ end
1325
1342
end
1326
1343
1327
1344
@testset " diagonal triple multiplication (#49005)" begin
1328
- n = 10
1345
+ local n = 10
1329
1346
@test * (Diagonal (ones (n)), Diagonal (1 : n), Diagonal (ones (n))) isa Diagonal
1330
1347
@test_throws DimensionMismatch (* (Diagonal (ones (n)), Diagonal (1 : n), Diagonal (ones (n+ 1 ))))
1331
1348
@test_throws DimensionMismatch (* (Diagonal (ones (n)), Diagonal (1 : n+ 1 ), Diagonal (ones (n+ 1 ))))
@@ -1441,10 +1458,12 @@ end
1441
1458
for p in ([1 2 ; 3 4 ], [1 2 + im; 2 - im 4 + 2im ])
1442
1459
m = SizedArrays. SizedArray {(2,2)} (p)
1443
1460
D = Diagonal (fill (m, 2 ))
1461
+ M = Matrix (D)
1444
1462
for T in (Symmetric, Hermitian)
1445
1463
S = T (fill (m, 2 , 2 ))
1446
- @test D + S == Array (D) + Array (S)
1447
- @test S + D == Array (S) + Array (D)
1464
+ SA = Array (S)
1465
+ @test D + S == M + SA
1466
+ @test S + D == SA + M
1448
1467
end
1449
1468
end
1450
1469
end
@@ -1456,12 +1475,14 @@ end
1456
1475
1457
1476
@testset " zeros in kron with block matrices" begin
1458
1477
D = Diagonal (1 : 4 )
1478
+ M = Matrix (D)
1459
1479
B = reshape ([ones (2 ,2 ), ones (3 ,2 ), ones (2 ,3 ), ones (3 ,3 )], 2 , 2 )
1460
- @test kron (D, B) == kron (Array (D) , B)
1461
- @test kron (B, D) == kron (B, Array (D) )
1480
+ @test kron (D, B) == kron (M , B)
1481
+ @test kron (B, D) == kron (B, M )
1462
1482
D2 = Diagonal ([ones (2 ,2 ), ones (3 ,3 )])
1463
- @test kron (D, D2) == kron (D, Array {eltype(D2)} (D2))
1464
- @test kron (D2, D) == kron (Array {eltype(D2)} (D2), D)
1483
+ M2 = Array {eltype(D2)} (D2)
1484
+ @test kron (D, D2) == kron (D, M2)
1485
+ @test kron (D2, D) == kron (M2, D)
1465
1486
end
1466
1487
1467
1488
@testset " opnorms" begin
0 commit comments