22
33# matmul.jl: Everything to do with dense matrix multiplication
44
5- arithtype (T) = T
6- arithtype (:: Type{Bool} ) = Int
7-
85matprod (x, y) = x* y + x* y
96
107# multiply by diagonal matrix as vector
@@ -78,11 +75,11 @@ At_mul_B{T<:BlasComplex}(x::StridedVector{T}, y::StridedVector{T}) = [BLAS.dotu(
7875
7976# Matrix-vector multiplication
8077function (* ){T<: BlasFloat ,S}(A:: StridedMatrix{T} , x:: StridedVector{S} )
81- TS = promote_op (matprod, arithtype (T), arithtype (S) )
78+ TS = promote_op (matprod, T, S )
8279 A_mul_B! (similar (x, TS, size (A,1 )), A, convert (AbstractVector{TS}, x))
8380end
8481function (* ){T,S}(A:: AbstractMatrix{T} , x:: AbstractVector{S} )
85- TS = promote_op (matprod, arithtype (T), arithtype (S) )
82+ TS = promote_op (matprod, T, S )
8683 A_mul_B! (similar (x,TS,size (A,1 )),A,x)
8784end
8885(* )(A:: AbstractVector , B:: AbstractMatrix ) = reshape (A,length (A),1 )* B
10198A_mul_B! (y:: AbstractVector , A:: AbstractVecOrMat , x:: AbstractVector ) = generic_matvecmul! (y, ' N' , A, x)
10299
103100function At_mul_B {T<:BlasFloat,S} (A:: StridedMatrix{T} , x:: StridedVector{S} )
104- TS = promote_op (matprod, arithtype (T), arithtype (S) )
101+ TS = promote_op (matprod, T, S )
105102 At_mul_B! (similar (x,TS,size (A,2 )), A, convert (AbstractVector{TS}, x))
106103end
107104function At_mul_B {T,S} (A:: AbstractMatrix{T} , x:: AbstractVector{S} )
108- TS = promote_op (matprod, arithtype (T), arithtype (S) )
105+ TS = promote_op (matprod, T, S )
109106 At_mul_B! (similar (x,TS,size (A,2 )), A, x)
110107end
111108At_mul_B! {T<:BlasFloat} (y:: StridedVector{T} , A:: StridedVecOrMat{T} , x:: StridedVector{T} ) = gemv! (y, ' T' , A, x)
112109At_mul_B! (y:: AbstractVector , A:: AbstractVecOrMat , x:: AbstractVector ) = generic_matvecmul! (y, ' T' , A, x)
113110
114111function Ac_mul_B {T<:BlasFloat,S} (A:: StridedMatrix{T} , x:: StridedVector{S} )
115- TS = promote_op (matprod, arithtype (T), arithtype (S) )
112+ TS = promote_op (matprod, T, S )
116113 Ac_mul_B! (similar (x,TS,size (A,2 )),A,convert (AbstractVector{TS},x))
117114end
118115function Ac_mul_B {T,S} (A:: AbstractMatrix{T} , x:: AbstractVector{S} )
119- TS = promote_op (matprod, arithtype (T), arithtype (S) )
116+ TS = promote_op (matprod, T, S )
120117 Ac_mul_B! (similar (x,TS,size (A,2 )), A, x)
121118end
122119
@@ -127,7 +124,7 @@ Ac_mul_B!(y::AbstractVector, A::AbstractVecOrMat, x::AbstractVector) = generic_m
127124# Matrix-matrix multiplication
128125
129126function (* ){T,S}(A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
130- TS = promote_op (matprod, arithtype (T), arithtype (S) )
127+ TS = promote_op (matprod, T, S )
131128 A_mul_B! (similar (B, TS, (size (A,1 ), size (B,2 ))), A, B)
132129end
133130A_mul_B! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = gemm_wrapper! (C, ' N' , ' N' , A, B)
@@ -144,14 +141,14 @@ end
144141A_mul_B! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' N' , ' N' , A, B)
145142
146143function At_mul_B {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
147- TS = promote_op (matprod, arithtype (T), arithtype (S) )
144+ TS = promote_op (matprod, T, S )
148145 At_mul_B! (similar (B, TS, (size (A,2 ), size (B,2 ))), A, B)
149146end
150147At_mul_B! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = is (A,B) ? syrk_wrapper! (C, ' T' , A) : gemm_wrapper! (C, ' T' , ' N' , A, B)
151148At_mul_B! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' T' , ' N' , A, B)
152149
153150function A_mul_Bt {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
154- TS = promote_op (matprod, arithtype (T), arithtype (S) )
151+ TS = promote_op (matprod, T, S )
155152 A_mul_Bt! (similar (B, TS, (size (A,1 ), size (B,1 ))), A, B)
156153end
157154A_mul_Bt! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = is (A,B) ? syrk_wrapper! (C, ' N' , A) : gemm_wrapper! (C, ' N' , ' T' , A, B)
168165A_mul_Bt! (C:: AbstractVecOrMat , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' N' , ' T' , A, B)
169166
170167function At_mul_Bt {T,S} (A:: AbstractMatrix{T} , B:: AbstractVecOrMat{S} )
171- TS = promote_op (matprod, arithtype (T), arithtype (S) )
168+ TS = promote_op (matprod, T, S )
172169 At_mul_Bt! (similar (B, TS, (size (A,2 ), size (B,1 ))), A, B)
173170end
174171At_mul_Bt! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = gemm_wrapper! (C, ' T' , ' T' , A, B)
@@ -177,7 +174,7 @@ At_mul_Bt!(C::AbstractMatrix, A::AbstractVecOrMat, B::AbstractVecOrMat) = generi
177174Ac_mul_B {T<:BlasReal} (A:: StridedMatrix{T} , B:: StridedMatrix{T} ) = At_mul_B (A, B)
178175Ac_mul_B! {T<:BlasReal} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = At_mul_B! (C, A, B)
179176function Ac_mul_B {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
180- TS = promote_op (matprod, arithtype (T), arithtype (S) )
177+ TS = promote_op (matprod, T, S )
181178 Ac_mul_B! (similar (B, TS, (size (A,2 ), size (B,2 ))), A, B)
182179end
183180Ac_mul_B! {T<:BlasComplex} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = is (A,B) ? herk_wrapper! (C,' C' ,A) : gemm_wrapper! (C,' C' , ' N' , A, B)
@@ -186,14 +183,14 @@ Ac_mul_B!(C::AbstractMatrix, A::AbstractVecOrMat, B::AbstractVecOrMat) = generic
186183A_mul_Bc {T<:BlasFloat,S<:BlasReal} (A:: StridedMatrix{T} , B:: StridedMatrix{S} ) = A_mul_Bt (A, B)
187184A_mul_Bc! {T<:BlasFloat,S<:BlasReal} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{S} ) = A_mul_Bt! (C, A, B)
188185function A_mul_Bc {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
189- TS = promote_op (matprod, arithtype (T), arithtype (S) )
186+ TS = promote_op (matprod, T, S )
190187 A_mul_Bc! (similar (B,TS,(size (A,1 ),size (B,1 ))),A,B)
191188end
192189A_mul_Bc! {T<:BlasComplex} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = is (A,B) ? herk_wrapper! (C, ' N' , A) : gemm_wrapper! (C, ' N' , ' C' , A, B)
193190A_mul_Bc! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' N' , ' C' , A, B)
194191
195192Ac_mul_Bc {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} ) =
196- Ac_mul_Bc! (similar (B, promote_op (matprod, arithtype (T), arithtype (S) ), (size (A,2 ), size (B,1 ))), A, B)
193+ Ac_mul_Bc! (similar (B, promote_op (matprod, T, S ), (size (A,2 ), size (B,1 ))), A, B)
197194Ac_mul_Bc! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = gemm_wrapper! (C, ' C' , ' C' , A, B)
198195Ac_mul_Bc! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' C' , ' C' , A, B)
199196Ac_mul_Bt! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' C' , ' T' , A, B)
426423function generic_matmatmul {T,S} (tA, tB, A:: AbstractVecOrMat{T} , B:: AbstractMatrix{S} )
427424 mA, nA = lapack_size (tA, A)
428425 mB, nB = lapack_size (tB, B)
429- C = similar (B, promote_op (matprod, arithtype (T), arithtype (S) ), mA, nB)
426+ C = similar (B, promote_op (matprod, T, S ), mA, nB)
430427 generic_matmatmul! (C, tA, tB, A, B)
431428end
432429
0 commit comments