diff --git a/src/matrix_multiply.jl b/src/matrix_multiply.jl index 597e07ff..fa53f5ca 100644 --- a/src/matrix_multiply.jl +++ b/src/matrix_multiply.jl @@ -10,16 +10,18 @@ import LinearAlgebra: BlasFloat, matprod, mul! @inline *(A::StaticVector, B::StaticMatrix) = *(reshape(A, Size(Size(A)[1], 1)), B) @inline *(A::StaticVector, B::Transpose{<:Any, <:StaticVector}) = _mul(Size(A), Size(B), A, B) @inline *(A::StaticVector, B::Adjoint{<:Any, <:StaticVector}) = _mul(Size(A), Size(B), A, B) +@inline *(A::StaticArray{Tuple{N,1},<:Any,2}, B::Adjoint{<:Any,<:StaticVector}) where {N} = vec(A) * B +@inline *(A::StaticArray{Tuple{N,1},<:Any,2}, B::Transpose{<:Any,<:StaticVector}) where {N} = vec(A) * B @inline mul!(dest::StaticVecOrMat, A::StaticMatrix, B::StaticVector) = _mul!(Size(dest), dest, Size(A), Size(B), A, B) @inline mul!(dest::StaticVecOrMat, A::StaticMatrix, B::StaticMatrix) = _mul!(Size(dest), dest, Size(A), Size(B), A, B) @inline mul!(dest::StaticVecOrMat, A::StaticVector, B::StaticMatrix) = mul!(dest, reshape(A, Size(Size(A)[1], 1)), B) @inline mul!(dest::StaticVecOrMat, A::StaticVector, B::Transpose{<:Any, <:StaticVector}) = _mul!(Size(dest), dest, Size(A), Size(B), A, B) @inline mul!(dest::StaticVecOrMat, A::StaticVector, B::Adjoint{<:Any, <:StaticVector}) = _mul!(Size(dest), dest, Size(A), Size(B), A, B) - #@inline *{TA<:LinearAlgebra.BlasFloat,Tb}(A::StaticMatrix{TA}, b::StaticVector{Tb}) + # Implementations @generated function _mul(::Size{sa}, a::StaticMatrix{<:Any, <:Any, Ta}, b::AbstractVector{Tb}) where {sa, Ta, Tb} diff --git a/test/matrix_multiply.jl b/test/matrix_multiply.jl index 4781e3ad..f3b6f83d 100644 --- a/test/matrix_multiply.jl +++ b/test/matrix_multiply.jl @@ -77,6 +77,41 @@ using StaticArrays, Test, LinearAlgebra @test v4 * transpose(v5) === @SMatrix [3+0im 4+0im; 6+0im 8+0im] end + @testset "Column vector-vector" begin + cv_array = rand(4,1) + rv_array = rand(4) + a_array = cv_array * rv_array' + + cv = SMatrix{4,1}(cv_array) + rv = SVector{4}(rv_array) + @test (cv*adjoint(rv))::SMatrix ≈ a_array + + cv = MMatrix{4,1}(cv_array) + rv = MVector{4}(rv_array) + @test (cv*adjoint(rv))::SMatrix ≈ a_array + + cv = SMatrix{4,1}(cv_array) + rv = SVector{4}(rv_array) + @test (cv*transpose(rv))::SMatrix ≈ a_array + + cv = MMatrix{4,1}(cv_array) + rv = MVector{4}(rv_array) + @test (cv*transpose(rv))::SMatrix ≈ a_array + + cv_bad = @SMatrix rand(4,2) + rv = @SVector rand(4) + @test_throws DimensionMismatch cv_bad*transpose(rv) + @test_throws DimensionMismatch cv_bad*adjoint(rv) + @test_throws DimensionMismatch cv_bad*rv + + cv_bad = @MMatrix rand(4,2) + rv = @MVector rand(4) + + @test_throws DimensionMismatch cv_bad*transpose(rv) + @test_throws DimensionMismatch cv_bad*adjoint(rv) + @test_throws DimensionMismatch cv_bad*rv + end + @testset "Matrix-matrix" begin m = @SMatrix [1 2; 3 4] n = @SMatrix [2 3; 4 5]