|
8 | 8 |
|
9 | 9 | include("infinitearrays.jl")
|
10 | 10 |
|
| 11 | +# we may use this instead of rand(n) to generate deterministic arrays |
| 12 | +oneton(T::Type, sz...) = reshape(T.(1:prod(sz)), sz) |
| 13 | +oneton(sz...) = oneton(Float64, sz...) |
| 14 | + |
11 | 15 | @testset "fill array constructors and convert" begin
|
12 | 16 | for (Typ, funcs) in ((:Zeros, :zeros), (:Ones, :ones))
|
13 | 17 | @eval begin
|
@@ -592,36 +596,74 @@ end
|
592 | 596 | @test [1,2,3]*Zeros(1,3) ≡ Zeros(3,3)
|
593 | 597 | @test_throws MethodError [1,2,3]*Zeros(3) # Not defined for [1,2,3]*[0,0,0] either
|
594 | 598 |
|
| 599 | + @testset "Matrix multiplication with array elements" begin |
| 600 | + x = [1 2; 3 4] |
| 601 | + z = zero(SVector{2,Int}) |
| 602 | + ZV = Zeros{typeof(z)}(2) |
| 603 | + A = Fill(x, 3, 2) * ZV |
| 604 | + @test A isa Fill |
| 605 | + @test size(A) == (3,) |
| 606 | + @test A[1] == x * z |
| 607 | + @test_throws DimensionMismatch Fill(x, 1, 1) * ZV |
| 608 | + @test_throws DimensionMismatch Fill(oneton(1,1), 1, length(ZV)) * ZV |
| 609 | + |
| 610 | + @test_throws DimensionMismatch Ones(SMatrix{3,3,Int,9},2) * Ones(SMatrix{2,2,Int,4},1,2) |
| 611 | + end |
| 612 | + |
595 | 613 | @testset "Check multiplication by Adjoint vectors works as expected." begin
|
596 |
| - @test randn(4, 3)' * Zeros(4) ≡ Zeros(3) |
597 |
| - @test randn(4)' * Zeros(4) ≡ transpose(randn(4)) * Zeros(4) ≡ zero(Float64) |
| 614 | + @test @inferred(oneton(4, 3)' * Zeros(4)) ≡ Zeros(3) |
| 615 | + @test @inferred(oneton(4)' * Zeros(4)) ≡ @inferred(transpose(oneton(4)) * Zeros(4)) == 0.0 |
598 | 616 | @test [1, 2, 3]' * Zeros{Int}(3) ≡ zero(Int)
|
599 | 617 | @test [SVector(1,2)', SVector(2,3)', SVector(3,4)']' * Zeros{Int}(3) === SVector(0,0)
|
600 |
| - @test_throws DimensionMismatch randn(4)' * Zeros(3) |
601 |
| - @test Zeros(5)' * randn(5,3) ≡ Zeros(5)'*Zeros(5,3) ≡ Zeros(5)'*Ones(5,3) ≡ Zeros(3)' |
602 |
| - @test abs(Zeros(5)' * randn(5)) ≡ abs(Zeros(5)' * Zeros(5)) ≡ abs(Zeros(5)' * Ones(5)) ≡ 0.0 |
| 618 | + @test_throws DimensionMismatch oneton(4)' * Zeros(3) |
| 619 | + @test Zeros(5)' * oneton(5,3) ≡ Zeros(5)'*Zeros(5,3) ≡ Zeros(5)'*Ones(5,3) ≡ Zeros(3)' |
| 620 | + @test abs(Zeros(5)' * oneton(5)) == abs(Zeros(5)' * Zeros(5)) ≡ abs(Zeros(5)' * Ones(5)) == 0.0 |
603 | 621 | @test Zeros(5) * Zeros(6)' ≡ Zeros(5,1) * Zeros(6)' ≡ Zeros(5,6)
|
604 |
| - @test randn(5) * Zeros(6)' ≡ randn(5,1) * Zeros(6)' ≡ Zeros(5,6) |
605 |
| - @test Zeros(5) * randn(6)' ≡ Zeros(5,6) |
| 622 | + @test oneton(5) * Zeros(6)' ≡ oneton(5,1) * Zeros(6)' ≡ Zeros(5,6) |
| 623 | + @test Zeros(5) * oneton(6)' ≡ Zeros(5,6) |
606 | 624 |
|
607 |
| - @test ([[1,2]])' * Zeros{SVector{2,Int}}(1) ≡ 0 |
608 |
| - @test_broken ([[1,2,3]])' * Zeros{SVector{2,Int}}(1) |
| 625 | + @test @inferred(Zeros{Int}(0)' * Zeros{Int}(0)) === zero(Int) |
| 626 | + |
| 627 | + @test Any[1,2.0]' * Zeros{Int}(2) == 0 |
| 628 | + @test Real[1,2.0]' * Zeros{Int}(2) == 0 |
| 629 | + |
| 630 | + @test @inferred(([[1,2]])' * Zeros{SVector{2,Int}}(1)) ≡ 0 |
| 631 | + @test ([[1,2], [1,2]])' * Zeros{SVector{2,Int}}(2) ≡ 0 |
| 632 | + @test_throws DimensionMismatch ([[1,2,3]])' * Zeros{SVector{2,Int}}(1) |
| 633 | + @test_throws DimensionMismatch ([[1,2,3], [1,2]])' * Zeros{SVector{2,Int}}(2) |
| 634 | + |
| 635 | + A = SMatrix{2,1,Int,2}[]' |
| 636 | + B = Zeros(SVector{2,Int},0) |
| 637 | + C = collect(B) |
| 638 | + @test @inferred(A * B) == @inferred(A * C) |
609 | 639 | end
|
610 | 640 |
|
611 | 641 | @testset "Check multiplication by Transpose-d vectors works as expected." begin
|
612 |
| - @test transpose(randn(4, 3)) * Zeros(4) === Zeros(3) |
613 |
| - @test transpose(randn(4)) * Zeros(4) === zero(Float64) |
| 642 | + @test transpose(oneton(4, 3)) * Zeros(4) === Zeros(3) |
| 643 | + @test transpose(oneton(4)) * Zeros(4) == 0.0 |
614 | 644 | @test transpose([1, 2, 3]) * Zeros{Int}(3) === zero(Int)
|
615 |
| - @test_throws DimensionMismatch transpose(randn(4)) * Zeros(3) |
616 |
| - @test transpose(Zeros(5)) * randn(5,3) ≡ transpose(Zeros(5))*Zeros(5,3) ≡ transpose(Zeros(5))*Ones(5,3) ≡ transpose(Zeros(3)) |
617 |
| - @test abs(transpose(Zeros(5)) * randn(5)) ≡ abs(transpose(Zeros(5)) * Zeros(5)) ≡ abs(transpose(Zeros(5)) * Ones(5)) ≡ 0.0 |
618 |
| - @test randn(5) * transpose(Zeros(6)) ≡ randn(5,1) * transpose(Zeros(6)) ≡ Zeros(5,6) |
619 |
| - @test Zeros(5) * transpose(randn(6)) ≡ Zeros(5,6) |
620 |
| - @test transpose(randn(5)) * Zeros(5) ≡ 0.0 |
621 |
| - @test transpose(randn(5) .+ im) * Zeros(5) ≡ 0.0 + 0im |
| 645 | + @test_throws DimensionMismatch transpose(oneton(4)) * Zeros(3) |
| 646 | + @test transpose(Zeros(5)) * oneton(5,3) ≡ transpose(Zeros(5))*Zeros(5,3) ≡ transpose(Zeros(5))*Ones(5,3) ≡ transpose(Zeros(3)) |
| 647 | + @test abs(transpose(Zeros(5)) * oneton(5)) ≡ abs(transpose(Zeros(5)) * Zeros(5)) ≡ abs(transpose(Zeros(5)) * Ones(5)) ≡ 0.0 |
| 648 | + @test oneton(5) * transpose(Zeros(6)) ≡ oneton(5,1) * transpose(Zeros(6)) ≡ Zeros(5,6) |
| 649 | + @test Zeros(5) * transpose(oneton(6)) ≡ Zeros(5,6) |
| 650 | + @test transpose(oneton(5)) * Zeros(5) == 0.0 |
| 651 | + @test transpose(oneton(5) .+ im) * Zeros(5) == 0.0 + 0im |
| 652 | + |
| 653 | + @test @inferred(transpose(Zeros{Int}(0)) * Zeros{Int}(0)) === zero(Int) |
622 | 654 |
|
623 |
| - @test transpose([[1,2]]) * Zeros{SVector{2,Int}}(1) ≡ 0 |
624 |
| - @test_broken transpose([[1,2,3]]) * Zeros{SVector{2,Int}}(1) |
| 655 | + @test transpose(Any[1,2.0]) * Zeros{Int}(2) == 0 |
| 656 | + @test transpose(Real[1,2.0]) * Zeros{Int}(2) == 0 |
| 657 | + |
| 658 | + @test @inferred(transpose([[1,2]]) * Zeros{SVector{2,Int}}(1)) ≡ 0 |
| 659 | + @test transpose([[1,2], [1,2]]) * Zeros{SVector{2,Int}}(2) ≡ 0 |
| 660 | + @test_throws DimensionMismatch transpose([[1,2,3]]) * Zeros{SVector{2,Int}}(1) |
| 661 | + @test_throws DimensionMismatch transpose([[1,2,3], [1,2]]) * Zeros{SVector{2,Int}}(2) |
| 662 | + |
| 663 | + A = transpose(SMatrix{2,1,Int,2}[]) |
| 664 | + B = Zeros(SVector{2,Int},0) |
| 665 | + C = collect(B) |
| 666 | + @test @inferred(A * B) == @inferred(A * C) |
625 | 667 |
|
626 | 668 | @testset "Diagonal mul introduced in v1.9" begin
|
627 | 669 | @test Zeros(5)'*Diagonal(1:5) ≡ Zeros(5)'
|
@@ -1386,6 +1428,48 @@ end
|
1386 | 1428 | f = Zeros((Base.IdentityUnitRange(3:4), Base.IdentityUnitRange(3:4)))
|
1387 | 1429 | @test_throws ArgumentError f * f
|
1388 | 1430 |
|
| 1431 | + @testset "Arrays as elements" begin |
| 1432 | + SMT = SMatrix{2,2,Int,4} |
| 1433 | + SVT = SVector{2,Int} |
| 1434 | + @test @inferred(Zeros{SMT}(0,0) * Fill([1 2; 3 4], 0, 0)) == Zeros{SMT}(0,0) |
| 1435 | + @test @inferred(Zeros{SMT}(4,2) * Fill([1 2; 3 4], 2, 3)) == Zeros{SMT}(4,3) |
| 1436 | + @test @inferred(Fill([1 2; 3 4], 2, 3) * Zeros{SMT}(3, 4)) == Zeros{SMT}(2,4) |
| 1437 | + @test @inferred(Zeros{SMT}(4,2) * Fill([1, 2], 2, 3)) == Zeros{SVT}(4,3) |
| 1438 | + @test @inferred(Fill([1 2], 2, 3) * Zeros{SMT}(3,4)) == Zeros{SMatrix{1,2,Int,2}}(2,4) |
| 1439 | + |
| 1440 | + TSM = SMatrix{2,2,Int,4} |
| 1441 | + s = TSM(1:4) |
| 1442 | + for n in 0:3 |
| 1443 | + v = fill(s, 1) |
| 1444 | + z = zeros(TSM, n) |
| 1445 | + A = @inferred Zeros{TSM}(n) * Diagonal(v) |
| 1446 | + B = z * Diagonal(v) |
| 1447 | + @test A == B |
| 1448 | + |
| 1449 | + w = fill(s, n) |
| 1450 | + A = @inferred Diagonal(w) * Zeros{TSM}(n) |
| 1451 | + B = Diagonal(w) * z |
| 1452 | + @test A == B |
| 1453 | + |
| 1454 | + A = @inferred Zeros{TSM}(2n, n) * Diagonal(w) |
| 1455 | + B = zeros(TSM, 2n, n) * Diagonal(w) |
| 1456 | + @test A == B |
| 1457 | + |
| 1458 | + A = @inferred Diagonal(w) * Zeros{TSM}(n, 2n) |
| 1459 | + B = Diagonal(w) * zeros(TSM, n, 2n) |
| 1460 | + @test A == B |
| 1461 | + end |
| 1462 | + |
| 1463 | + D = Diagonal([[1 2; 3 4], [1 2 3; 4 5 6]]) |
| 1464 | + @test @inferred(Zeros(TSM, 2,2) * D) == zeros(TSM, 2,2) * D |
| 1465 | + |
| 1466 | + # doubly nested |
| 1467 | + A = [[[1,2]]]' |
| 1468 | + Z = Zeros(SMatrix{1,1,SMatrix{2,2,Int,4},1},1) |
| 1469 | + Z2 = zeros(SMatrix{1,1,SMatrix{2,2,Int,4},1},1) |
| 1470 | + @test A * Z == A * Z2 |
| 1471 | + end |
| 1472 | + |
1389 | 1473 | for W in (zeros(3,4), @MMatrix zeros(3,4))
|
1390 | 1474 | mW, nW = size(W)
|
1391 | 1475 | @test mul!(W, Fill(2,mW,5), Fill(3,5,nW)) ≈ Fill(30,mW,nW) ≈ fill(2,mW,5) * fill(3,5,nW)
|
|
0 commit comments