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
@@ -134,7 +131,7 @@ Ac_mul_B!(y::AbstractVector, A::AbstractVecOrMat, x::AbstractVector) = generic_m
134131Matrix multiplication.
135132"""
136133function (* ){T,S}(A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
137- TS = promote_op (matprod, arithtype (T), arithtype (S) )
134+ TS = promote_op (matprod, T, S )
138135 A_mul_B! (similar (B, TS, (size (A,1 ), size (B,2 ))), A, B)
139136end
140137A_mul_B! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = gemm_wrapper! (C, ' N' , ' N' , A, B)
@@ -168,14 +165,14 @@ julia> Y
168165A_mul_B! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' N' , ' N' , A, B)
169166
170167function At_mul_B {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
171- TS = promote_op (matprod, arithtype (T), arithtype (S) )
168+ TS = promote_op (matprod, T, S )
172169 At_mul_B! (similar (B, TS, (size (A,2 ), size (B,2 ))), A, B)
173170end
174171At_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)
175172At_mul_B! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' T' , ' N' , A, B)
176173
177174function A_mul_Bt {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
178- TS = promote_op (matprod, arithtype (T), arithtype (S) )
175+ TS = promote_op (matprod, T, S )
179176 A_mul_Bt! (similar (B, TS, (size (A,1 ), size (B,1 ))), A, B)
180177end
181178A_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)
192189A_mul_Bt! (C:: AbstractVecOrMat , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' N' , ' T' , A, B)
193190
194191function At_mul_Bt {T,S} (A:: AbstractMatrix{T} , B:: AbstractVecOrMat{S} )
195- TS = promote_op (matprod, arithtype (T), arithtype (S) )
192+ TS = promote_op (matprod, T, S )
196193 At_mul_Bt! (similar (B, TS, (size (A,2 ), size (B,1 ))), A, B)
197194end
198195At_mul_Bt! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = gemm_wrapper! (C, ' T' , ' T' , A, B)
@@ -201,7 +198,7 @@ At_mul_Bt!(C::AbstractMatrix, A::AbstractVecOrMat, B::AbstractVecOrMat) = generi
201198Ac_mul_B {T<:BlasReal} (A:: StridedMatrix{T} , B:: StridedMatrix{T} ) = At_mul_B (A, B)
202199Ac_mul_B! {T<:BlasReal} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = At_mul_B! (C, A, B)
203200function Ac_mul_B {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
204- TS = promote_op (matprod, arithtype (T), arithtype (S) )
201+ TS = promote_op (matprod, T, S )
205202 Ac_mul_B! (similar (B, TS, (size (A,2 ), size (B,2 ))), A, B)
206203end
207204Ac_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)
@@ -210,14 +207,14 @@ Ac_mul_B!(C::AbstractMatrix, A::AbstractVecOrMat, B::AbstractVecOrMat) = generic
210207A_mul_Bc {T<:BlasFloat,S<:BlasReal} (A:: StridedMatrix{T} , B:: StridedMatrix{S} ) = A_mul_Bt (A, B)
211208A_mul_Bc! {T<:BlasFloat,S<:BlasReal} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{S} ) = A_mul_Bt! (C, A, B)
212209function A_mul_Bc {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
213- TS = promote_op (matprod, arithtype (T), arithtype (S) )
210+ TS = promote_op (matprod, T, S )
214211 A_mul_Bc! (similar (B,TS,(size (A,1 ),size (B,1 ))),A,B)
215212end
216213A_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)
217214A_mul_Bc! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' N' , ' C' , A, B)
218215
219216Ac_mul_Bc {T,S} (A:: AbstractMatrix{T} , B:: AbstractMatrix{S} ) =
220- Ac_mul_Bc! (similar (B, promote_op (matprod, 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)
221218Ac_mul_Bc! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = gemm_wrapper! (C, ' C' , ' C' , A, B)
222219Ac_mul_Bc! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' C' , ' C' , A, B)
223220Ac_mul_Bt! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' C' , ' T' , A, B)
450447function generic_matmatmul {T,S} (tA, tB, A:: AbstractVecOrMat{T} , B:: AbstractMatrix{S} )
451448 mA, nA = lapack_size (tA, A)
452449 mB, nB = lapack_size (tB, B)
453- C = similar (B, promote_op (matprod, arithtype (T), arithtype (S) ), mA, nB)
450+ C = similar (B, promote_op (matprod, T, S ), mA, nB)
454451 generic_matmatmul! (C, tA, tB, A, B)
455452end
456453
0 commit comments