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
@@ -132,7 +131,7 @@ Ac_mul_B!(y::AbstractVector, A::AbstractVecOrMat, x::AbstractVector) = generic_m
132131Matrix multiplication.
133132"""
134133function (* ){T,S}(A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
135- TS = promote_op (* , arithtype (T), arithtype (S) )
134+ TS = promote_op (matprod, T, S )
136135 A_mul_B! (similar (B, TS, (size (A,1 ), size (B,2 ))), A, B)
137136end
138137A_mul_B! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = gemm_wrapper! (C, ' N' , ' N' , A, B)
@@ -166,14 +165,14 @@ julia> Y
166165A_mul_B! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' N' , ' N' , A, B)
167166
168167function At_mul_B {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
169- TS = promote_op (* , arithtype (T), arithtype (S) )
168+ TS = promote_op (matprod, T, S )
170169 At_mul_B! (similar (B, TS, (size (A,2 ), size (B,2 ))), A, B)
171170end
172171At_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)
173172At_mul_B! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' T' , ' N' , A, B)
174173
175174function A_mul_Bt {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
176- TS = promote_op (* , arithtype (T), arithtype (S) )
175+ TS = promote_op (matprod, T, S )
177176 A_mul_Bt! (similar (B, TS, (size (A,1 ), size (B,1 ))), A, B)
178177end
179178A_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)
190189A_mul_Bt! (C:: AbstractVecOrMat , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' N' , ' T' , A, B)
191190
192191function At_mul_Bt {T,S} (A:: AbstractMatrix{T} , B:: AbstractVecOrMat{S} )
193- TS = promote_op (* , arithtype (T), arithtype (S) )
192+ TS = promote_op (matprod, T, S )
194193 At_mul_Bt! (similar (B, TS, (size (A,2 ), size (B,1 ))), A, B)
195194end
196195At_mul_Bt! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = gemm_wrapper! (C, ' T' , ' T' , A, B)
@@ -199,7 +198,7 @@ At_mul_Bt!(C::AbstractMatrix, A::AbstractVecOrMat, B::AbstractVecOrMat) = generi
199198Ac_mul_B {T<:BlasReal} (A:: StridedMatrix{T} , B:: StridedMatrix{T} ) = At_mul_B (A, B)
200199Ac_mul_B! {T<:BlasReal} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = At_mul_B! (C, A, B)
201200function Ac_mul_B {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
202- TS = promote_op (* , arithtype (T), arithtype (S) )
201+ TS = promote_op (matprod, T, S )
203202 Ac_mul_B! (similar (B, TS, (size (A,2 ), size (B,2 ))), A, B)
204203end
205204Ac_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)
@@ -208,14 +207,14 @@ Ac_mul_B!(C::AbstractMatrix, A::AbstractVecOrMat, B::AbstractVecOrMat) = generic
208207A_mul_Bc {T<:BlasFloat,S<:BlasReal} (A:: StridedMatrix{T} , B:: StridedMatrix{S} ) = A_mul_Bt (A, B)
209208A_mul_Bc! {T<:BlasFloat,S<:BlasReal} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{S} ) = A_mul_Bt! (C, A, B)
210209function A_mul_Bc {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
211- TS = promote_op (* , arithtype (T), arithtype (S) )
210+ TS = promote_op (matprod, T, S )
212211 A_mul_Bc! (similar (B,TS,(size (A,1 ),size (B,1 ))),A,B)
213212end
214213A_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)
215214A_mul_Bc! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' N' , ' C' , A, B)
216215
217216Ac_mul_Bc {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} ) =
218- Ac_mul_Bc! (similar (B, promote_op (* , arithtype (T), arithtype (S) ), (size (A,2 ), size (B,1 ))), A, B)
217+ Ac_mul_Bc! (similar (B, promote_op (matprod, T, S ), (size (A,2 ), size (B,1 ))), A, B)
219218Ac_mul_Bc! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = gemm_wrapper! (C, ' C' , ' C' , A, B)
220219Ac_mul_Bc! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' C' , ' C' , A, B)
221220Ac_mul_Bt! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' C' , ' T' , A, B)
448447function generic_matmatmul {T,S} (tA, tB, A:: AbstractVecOrMat{T} , B:: AbstractMatrix{S} )
449448 mA, nA = lapack_size (tA, A)
450449 mB, nB = lapack_size (tB, B)
451- C = similar (B, promote_op (* , arithtype (T), arithtype (S) ), mA, nB)
450+ C = similar (B, promote_op (matprod, T, S ), mA, nB)
452451 generic_matmatmul! (C, tA, tB, A, B)
453452end
454453
642641
643642# multiply 2x2 matrices
644643function matmul2x2 {T,S} (tA, tB, A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
645- matmul2x2! (similar (B, promote_op (* , T, S), 2 , 2 ), tA, tB, A, B)
644+ matmul2x2! (similar (B, promote_op (matprod , T, S), 2 , 2 ), tA, tB, A, B)
646645end
647646
648647function matmul2x2! {T,S,R} (C:: AbstractMatrix{R} , tA, tB, A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
671670
672671# Multiply 3x3 matrices
673672function matmul3x3 {T,S} (tA, tB, A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
674- matmul3x3! (similar (B, promote_op (* , T, S), 3 , 3 ), tA, tB, A, B)
673+ matmul3x3! (similar (B, promote_op (matprod , T, S), 3 , 3 ), tA, tB, A, B)
675674end
676675
677676function matmul3x3! {T,S,R} (C:: AbstractMatrix{R} , tA, tB, A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
0 commit comments