22
33# matmul.jl: Everything to do with dense matrix multiplication
44
5- arithtype (T) = T
6- arithtype (:: Type{Bool} ) = Int
5+ matprod (x, y) = x* y + x* y
76
87# multiply by diagonal matrix as vector
98function scale! (C:: AbstractMatrix , A:: AbstractMatrix , b:: AbstractVector )
@@ -76,11 +75,11 @@ At_mul_B{T<:BlasComplex}(x::StridedVector{T}, y::StridedVector{T}) = [BLAS.dotu(
7675
7776# Matrix-vector multiplication
7877function (* ){T<: BlasFloat ,S}(A:: StridedMatrix{T} , x:: StridedVector{S} )
79- TS = promote_op (* , arithtype (T), arithtype (S) )
78+ TS = promote_op (matprod, T, S )
8079 A_mul_B! (similar (x, TS, size (A,1 )), A, convert (AbstractVector{TS}, x))
8180end
8281function (* ){T,S}(A:: AbstractMatrix{T} , x:: AbstractVector{S} )
83- TS = promote_op (* , arithtype (T), arithtype (S) )
82+ TS = promote_op (matprod, T, S )
8483 A_mul_B! (similar (x,TS,size (A,1 )),A,x)
8584end
8685(* )(A:: AbstractVector , B:: AbstractMatrix ) = reshape (A,length (A),1 )* B
9998A_mul_B! (y:: AbstractVector , A:: AbstractVecOrMat , x:: AbstractVector ) = generic_matvecmul! (y, ' N' , A, x)
10099
101100function At_mul_B {T<:BlasFloat,S} (A:: StridedMatrix{T} , x:: StridedVector{S} )
102- TS = promote_op (* , arithtype (T), arithtype (S) )
101+ TS = promote_op (matprod, T, S )
103102 At_mul_B! (similar (x,TS,size (A,2 )), A, convert (AbstractVector{TS}, x))
104103end
105104function At_mul_B {T,S} (A:: AbstractMatrix{T} , x:: AbstractVector{S} )
106- TS = promote_op (* , arithtype (T), arithtype (S) )
105+ TS = promote_op (matprod, T, S )
107106 At_mul_B! (similar (x,TS,size (A,2 )), A, x)
108107end
109108At_mul_B! {T<:BlasFloat} (y:: StridedVector{T} , A:: StridedVecOrMat{T} , x:: StridedVector{T} ) = gemv! (y, ' T' , A, x)
110109At_mul_B! (y:: AbstractVector , A:: AbstractVecOrMat , x:: AbstractVector ) = generic_matvecmul! (y, ' T' , A, x)
111110
112111function Ac_mul_B {T<:BlasFloat,S} (A:: StridedMatrix{T} , x:: StridedVector{S} )
113- TS = promote_op (* , arithtype (T), arithtype (S) )
112+ TS = promote_op (matprod, T, S )
114113 Ac_mul_B! (similar (x,TS,size (A,2 )),A,convert (AbstractVector{TS},x))
115114end
116115function Ac_mul_B {T,S} (A:: AbstractMatrix{T} , x:: AbstractVector{S} )
117- TS = promote_op (* , arithtype (T), arithtype (S) )
116+ TS = promote_op (matprod, T, S )
118117 Ac_mul_B! (similar (x,TS,size (A,2 )), A, x)
119118end
120119
@@ -141,7 +140,7 @@ julia> [1 1; 0 1] * [1 0; 1 1]
141140```
142141"""
143142function (* ){T,S}(A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
144- TS = promote_op (* , arithtype (T), arithtype (S) )
143+ TS = promote_op (matprod, T, S )
145144 A_mul_B! (similar (B, TS, (size (A,1 ), size (B,2 ))), A, B)
146145end
147146A_mul_B! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = gemm_wrapper! (C, ' N' , ' N' , A, B)
@@ -177,14 +176,14 @@ julia> Y
177176A_mul_B! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' N' , ' N' , A, B)
178177
179178function At_mul_B {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
180- TS = promote_op (* , arithtype (T), arithtype (S) )
179+ TS = promote_op (matprod, T, S )
181180 At_mul_B! (similar (B, TS, (size (A,2 ), size (B,2 ))), A, B)
182181end
183182At_mul_B! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = A=== B ? syrk_wrapper! (C, ' T' , A) : gemm_wrapper! (C, ' T' , ' N' , A, B)
184183At_mul_B! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' T' , ' N' , A, B)
185184
186185function A_mul_Bt {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
187- TS = promote_op (* , arithtype (T), arithtype (S) )
186+ TS = promote_op (matprod, T, S )
188187 A_mul_Bt! (similar (B, TS, (size (A,1 ), size (B,1 ))), A, B)
189188end
190189A_mul_Bt! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = A=== B ? syrk_wrapper! (C, ' N' , A) : gemm_wrapper! (C, ' N' , ' T' , A, B)
201200A_mul_Bt! (C:: AbstractVecOrMat , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' N' , ' T' , A, B)
202201
203202function At_mul_Bt {T,S} (A:: AbstractMatrix{T} , B:: AbstractVecOrMat{S} )
204- TS = promote_op (* , arithtype (T), arithtype (S) )
203+ TS = promote_op (matprod, T, S )
205204 At_mul_Bt! (similar (B, TS, (size (A,2 ), size (B,1 ))), A, B)
206205end
207206At_mul_Bt! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = gemm_wrapper! (C, ' T' , ' T' , A, B)
@@ -210,7 +209,7 @@ At_mul_Bt!(C::AbstractMatrix, A::AbstractVecOrMat, B::AbstractVecOrMat) = generi
210209Ac_mul_B {T<:BlasReal} (A:: StridedMatrix{T} , B:: StridedMatrix{T} ) = At_mul_B (A, B)
211210Ac_mul_B! {T<:BlasReal} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = At_mul_B! (C, A, B)
212211function Ac_mul_B {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
213- TS = promote_op (* , arithtype (T), arithtype (S) )
212+ TS = promote_op (matprod, T, S )
214213 Ac_mul_B! (similar (B, TS, (size (A,2 ), size (B,2 ))), A, B)
215214end
216215Ac_mul_B! {T<:BlasComplex} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = A=== B ? herk_wrapper! (C,' C' ,A) : gemm_wrapper! (C,' C' , ' N' , A, B)
@@ -219,14 +218,14 @@ Ac_mul_B!(C::AbstractMatrix, A::AbstractVecOrMat, B::AbstractVecOrMat) = generic
219218A_mul_Bc {T<:BlasFloat,S<:BlasReal} (A:: StridedMatrix{T} , B:: StridedMatrix{S} ) = A_mul_Bt (A, B)
220219A_mul_Bc! {T<:BlasFloat,S<:BlasReal} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{S} ) = A_mul_Bt! (C, A, B)
221220function A_mul_Bc {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
222- TS = promote_op (* , arithtype (T), arithtype (S) )
221+ TS = promote_op (matprod, T, S )
223222 A_mul_Bc! (similar (B,TS,(size (A,1 ),size (B,1 ))),A,B)
224223end
225224A_mul_Bc! {T<:BlasComplex} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = A=== B ? herk_wrapper! (C, ' N' , A) : gemm_wrapper! (C, ' N' , ' C' , A, B)
226225A_mul_Bc! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' N' , ' C' , A, B)
227226
228227Ac_mul_Bc {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} ) =
229- Ac_mul_Bc! (similar (B, promote_op (* , arithtype (T), arithtype (S) ), (size (A,2 ), size (B,1 ))), A, B)
228+ Ac_mul_Bc! (similar (B, promote_op (matprod, T, S ), (size (A,2 ), size (B,1 ))), A, B)
230229Ac_mul_Bc! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = gemm_wrapper! (C, ' C' , ' C' , A, B)
231230Ac_mul_Bc! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' C' , ' C' , A, B)
232231Ac_mul_Bt! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' C' , ' T' , A, B)
459458function generic_matmatmul {T,S} (tA, tB, A:: AbstractVecOrMat{T} , B:: AbstractMatrix{S} )
460459 mA, nA = lapack_size (tA, A)
461460 mB, nB = lapack_size (tB, B)
462- C = similar (B, promote_op (* , arithtype (T), arithtype (S) ), mA, nB)
461+ C = similar (B, promote_op (matprod, T, S ), mA, nB)
463462 generic_matmatmul! (C, tA, tB, A, B)
464463end
465464
653652
654653# multiply 2x2 matrices
655654function matmul2x2 {T,S} (tA, tB, A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
656- matmul2x2! (similar (B, promote_op (* , T, S), 2 , 2 ), tA, tB, A, B)
655+ matmul2x2! (similar (B, promote_op (matprod , T, S), 2 , 2 ), tA, tB, A, B)
657656end
658657
659658function matmul2x2! {T,S,R} (C:: AbstractMatrix{R} , tA, tB, A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
682681
683682# Multiply 3x3 matrices
684683function matmul3x3 {T,S} (tA, tB, A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
685- matmul3x3! (similar (B, promote_op (* , T, S), 3 , 3 ), tA, tB, A, B)
684+ matmul3x3! (similar (B, promote_op (matprod , T, S), 3 , 3 ), tA, tB, A, B)
686685end
687686
688687function matmul3x3! {T,S,R} (C:: AbstractMatrix{R} , tA, tB, A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
0 commit comments