@@ -31,6 +31,7 @@ promote_matprod{T1,T2}(::Type{T1}, ::Type{T2}) = typeof(zero(T1)*zero(T2) + zero
31
31
# Manage dispatch of * and A_mul_B!
32
32
# TODO RowVector? (Inner product?)
33
33
34
+ @inline * (A:: StaticMatrix , B:: AbstractVector ) = _A_mul_B (Size (A), A, B)
34
35
@inline * (A:: StaticMatrix , B:: StaticVector ) = _A_mul_B (Size (A), Size (B), A, B)
35
36
@inline * (A:: StaticMatrix , B:: StaticMatrix ) = _A_mul_B (Size (A), Size (B), A, B)
36
37
@inline * (A:: StaticVector , B:: StaticMatrix ) = * (reshape (A, Size (Size (A)[1 ], 1 )), B)
@@ -45,6 +46,23 @@ promote_matprod{T1,T2}(::Type{T1}, ::Type{T2}) = typeof(zero(T1)*zero(T2) + zero
45
46
46
47
# Implementations
47
48
49
+ @generated function _A_mul_B (:: Size{sa} , a:: StaticMatrix{Ta} , b:: AbstractVector{Tb} ) where {sa, Ta, Tb}
50
+ if sa[2 ] != 0
51
+ exprs = [reduce ((ex1,ex2) -> :(+ ($ ex1,$ ex2)), [:(a[$ (sub2ind (sa, k, j))]* b[$ j]) for j = 1 : sa[2 ]]) for k = 1 : sa[1 ]]
52
+ else
53
+ exprs = [:(zero (T)) for k = 1 : sa[1 ]]
54
+ end
55
+
56
+ return quote
57
+ @_inline_meta
58
+ if length (b) != sa[2 ]
59
+ throw (DimensionMismatch (" Tried to multiply arrays of size $sa and $(size (b)) " ))
60
+ end
61
+ T = promote_matprod (Ta, Tb)
62
+ @inbounds return similar_type (b, T, Size (sa[1 ]))(tuple ($ (exprs... )))
63
+ end
64
+ end
65
+
48
66
@generated function _A_mul_B (:: Size{sa} , :: Size{sb} , a:: StaticMatrix{Ta} , b:: StaticVector{Tb} ) where {sa, sb, Ta, Tb}
49
67
if sb[1 ] != sa[2 ]
50
68
throw (DimensionMismatch (" Tried to multiply arrays of size $sa and $sb " ))
@@ -63,8 +81,6 @@ promote_matprod{T1,T2}(::Type{T1}, ::Type{T2}) = typeof(zero(T1)*zero(T2) + zero
63
81
end
64
82
end
65
83
66
- # TODO : I removed StaticMatrix * AbstractVector. Reinstate?
67
-
68
84
# outer product
69
85
@generated function _A_mul_B (:: Size{sa} , :: Size{sb} , a:: StaticVector{Ta} , b:: RowVector{Tb, <:StaticVector} ) where {sa, sb, Ta, Tb}
70
86
newsize = (sa[1 ], sb[2 ])
0 commit comments