@@ -26,11 +26,24 @@ increment{T<:Integer}(A::AbstractArray{T}) = increment!(copy(A))
2626# # sparse matrix multiplication
2727
2828function (* ){TvA,TiA,TvB,TiB}(A:: SparseMatrixCSC{TvA,TiA} , B:: SparseMatrixCSC{TvB,TiB} )
29+ (* )(sppromote (A, B)... )
30+ end
31+ for f in (:A_mul_Bt , :A_mul_Bc ,
32+ :At_mul_B , :Ac_mul_B ,
33+ :At_mul_Bt , :Ac_mul_Bc )
34+ @eval begin
35+ function ($ f){TvA,TiA,TvB,TiB}(A:: SparseMatrixCSC{TvA,TiA} , B:: SparseMatrixCSC{TvB,TiB} )
36+ ($ f)(sppromote (A, B)... )
37+ end
38+ end
39+ end
40+
41+ function sppromote {TvA,TiA,TvB,TiB} (A:: SparseMatrixCSC{TvA,TiA} , B:: SparseMatrixCSC{TvB,TiB} )
2942 Tv = promote_type (TvA, TvB)
3043 Ti = promote_type (TiA, TiB)
3144 A = convert (SparseMatrixCSC{Tv,Ti}, A)
3245 B = convert (SparseMatrixCSC{Tv,Ti}, B)
33- A * B
46+ A, B
3447end
3548
3649# In matrix-vector multiplication, the correct orientation of the vector is assumed.
109122# http://dl.acm.org/citation.cfm?id=355796
110123
111124(* ){Tv,Ti}(A:: SparseMatrixCSC{Tv,Ti} , B:: SparseMatrixCSC{Tv,Ti} ) = spmatmul (A,B)
125+ for (f, opA, opB) in ((:A_mul_Bt , :identity , :transpose ),
126+ (:A_mul_Bc , :identity , :ctranspose ),
127+ (:At_mul_B , :transpose , :identity ),
128+ (:Ac_mul_B , :ctranspose , :identity ),
129+ (:At_mul_Bt , :transpose , :transpose ),
130+ (:Ac_mul_Bc , :ctranspose , :ctranspose ))
131+ @eval begin
132+ function ($ f){Tv,Ti}(A:: SparseMatrixCSC{Tv,Ti} , B:: SparseMatrixCSC{Tv,Ti} )
133+ spmatmul (($ opA)(A), ($ opB)(B))
134+ end
135+ end
136+ end
112137
113138function spmatmul {Tv,Ti} (A:: SparseMatrixCSC{Tv,Ti} , B:: SparseMatrixCSC{Tv,Ti} ;
114139 sortindices:: Symbol = :sortcols )
0 commit comments