2
2
3
3
# matmul.jl: Everything to do with dense matrix multiplication
4
4
5
- arithtype (T) = T
6
- arithtype (:: Type{Bool} ) = Int
5
+ matprod (x, y) = x* y + x* y
7
6
8
7
# multiply by diagonal matrix as vector
9
8
function scale! (C:: AbstractMatrix , A:: AbstractMatrix , b:: AbstractVector )
@@ -76,11 +75,11 @@ At_mul_B{T<:BlasComplex}(x::StridedVector{T}, y::StridedVector{T}) = [BLAS.dotu(
76
75
77
76
# Matrix-vector multiplication
78
77
function (* ){T<: BlasFloat ,S}(A:: StridedMatrix{T} , x:: StridedVector{S} )
79
- TS = promote_op (* , arithtype (T), arithtype (S) )
78
+ TS = promote_op (matprod, T, S )
80
79
A_mul_B! (similar (x, TS, size (A,1 )), A, convert (AbstractVector{TS}, x))
81
80
end
82
81
function (* ){T,S}(A:: AbstractMatrix{T} , x:: AbstractVector{S} )
83
- TS = promote_op (* , arithtype (T), arithtype (S) )
82
+ TS = promote_op (matprod, T, S )
84
83
A_mul_B! (similar (x,TS,size (A,1 )),A,x)
85
84
end
86
85
(* )(A:: AbstractVector , B:: AbstractMatrix ) = reshape (A,length (A),1 )* B
99
98
A_mul_B! (y:: AbstractVector , A:: AbstractVecOrMat , x:: AbstractVector ) = generic_matvecmul! (y, ' N' , A, x)
100
99
101
100
function 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 )
103
102
At_mul_B! (similar (x,TS,size (A,2 )), A, convert (AbstractVector{TS}, x))
104
103
end
105
104
function 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 )
107
106
At_mul_B! (similar (x,TS,size (A,2 )), A, x)
108
107
end
109
108
At_mul_B! {T<:BlasFloat} (y:: StridedVector{T} , A:: StridedVecOrMat{T} , x:: StridedVector{T} ) = gemv! (y, ' T' , A, x)
110
109
At_mul_B! (y:: AbstractVector , A:: AbstractVecOrMat , x:: AbstractVector ) = generic_matvecmul! (y, ' T' , A, x)
111
110
112
111
function 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 )
114
113
Ac_mul_B! (similar (x,TS,size (A,2 )),A,convert (AbstractVector{TS},x))
115
114
end
116
115
function 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 )
118
117
Ac_mul_B! (similar (x,TS,size (A,2 )), A, x)
119
118
end
120
119
@@ -132,7 +131,7 @@ Ac_mul_B!(y::AbstractVector, A::AbstractVecOrMat, x::AbstractVector) = generic_m
132
131
Matrix multiplication.
133
132
"""
134
133
function (* ){T,S}(A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
135
- TS = promote_op (* , arithtype (T), arithtype (S) )
134
+ TS = promote_op (matprod, T, S )
136
135
A_mul_B! (similar (B, TS, (size (A,1 ), size (B,2 ))), A, B)
137
136
end
138
137
A_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
166
165
A_mul_B! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' N' , ' N' , A, B)
167
166
168
167
function 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 )
170
169
At_mul_B! (similar (B, TS, (size (A,2 ), size (B,2 ))), A, B)
171
170
end
172
171
At_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)
173
172
At_mul_B! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' T' , ' N' , A, B)
174
173
175
174
function 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 )
177
176
A_mul_Bt! (similar (B, TS, (size (A,1 ), size (B,1 ))), A, B)
178
177
end
179
178
A_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)
190
189
A_mul_Bt! (C:: AbstractVecOrMat , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' N' , ' T' , A, B)
191
190
192
191
function 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 )
194
193
At_mul_Bt! (similar (B, TS, (size (A,2 ), size (B,1 ))), A, B)
195
194
end
196
195
At_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
199
198
Ac_mul_B {T<:BlasReal} (A:: StridedMatrix{T} , B:: StridedMatrix{T} ) = At_mul_B (A, B)
200
199
Ac_mul_B! {T<:BlasReal} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = At_mul_B! (C, A, B)
201
200
function 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 )
203
202
Ac_mul_B! (similar (B, TS, (size (A,2 ), size (B,2 ))), A, B)
204
203
end
205
204
Ac_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
208
207
A_mul_Bc {T<:BlasFloat,S<:BlasReal} (A:: StridedMatrix{T} , B:: StridedMatrix{S} ) = A_mul_Bt (A, B)
209
208
A_mul_Bc! {T<:BlasFloat,S<:BlasReal} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{S} ) = A_mul_Bt! (C, A, B)
210
209
function 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 )
212
211
A_mul_Bc! (similar (B,TS,(size (A,1 ),size (B,1 ))),A,B)
213
212
end
214
213
A_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)
215
214
A_mul_Bc! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' N' , ' C' , A, B)
216
215
217
216
Ac_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)
219
218
Ac_mul_Bc! {T<:BlasFloat} (C:: StridedMatrix{T} , A:: StridedVecOrMat{T} , B:: StridedVecOrMat{T} ) = gemm_wrapper! (C, ' C' , ' C' , A, B)
220
219
Ac_mul_Bc! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' C' , ' C' , A, B)
221
220
Ac_mul_Bt! (C:: AbstractMatrix , A:: AbstractVecOrMat , B:: AbstractVecOrMat ) = generic_matmatmul! (C, ' C' , ' T' , A, B)
448
447
function generic_matmatmul {T,S} (tA, tB, A:: AbstractVecOrMat{T} , B:: AbstractMatrix{S} )
449
448
mA, nA = lapack_size (tA, A)
450
449
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)
452
451
generic_matmatmul! (C, tA, tB, A, B)
453
452
end
454
453
642
641
643
642
# multiply 2x2 matrices
644
643
function 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)
646
645
end
647
646
648
647
function matmul2x2! {T,S,R} (C:: AbstractMatrix{R} , tA, tB, A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
671
670
672
671
# Multiply 3x3 matrices
673
672
function 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)
675
674
end
676
675
677
676
function matmul3x3! {T,S,R} (C:: AbstractMatrix{R} , tA, tB, A:: AbstractMatrix{T} , B:: AbstractMatrix{S} )
0 commit comments