@@ -1494,7 +1494,7 @@ function (*)(A::StridedMatrix{Ta}, x::AbstractSparseVector{Tx}) where {Ta,Tx}
14941494 require_one_based_indexing (A, x)
14951495 m, n = size (A)
14961496 length (x) == n || throw (DimensionMismatch ())
1497- Ty = promote_type ( Ta, Tx)
1497+ Ty = promote_op (matprod, Ta, Tx)
14981498 y = Vector {Ty} (undef, m)
14991499 mul! (y, A, x)
15001500end
@@ -1531,23 +1531,62 @@ end
15311531
15321532function * (transA:: Transpose{<:Any,<:StridedMatrix{Ta}} , x:: AbstractSparseVector{Tx} ) where {Ta,Tx}
15331533 require_one_based_indexing (transA, x)
1534- A = transA. parent
1535- m, n = size (A)
1536- length (x) == m || throw (DimensionMismatch ())
1537- Ty = promote_type (Ta, Tx)
1538- y = Vector {Ty} (undef, n)
1539- mul! (y, transpose (A), x)
1534+ m, n = size (transA)
1535+ length (x) == n || throw (DimensionMismatch ())
1536+ Ty = promote_op (matprod, Ta, Tx)
1537+ y = Vector {Ty} (undef, m)
1538+ mul! (y, transA, x)
15401539end
15411540
15421541mul! (y:: AbstractVector{Ty} , transA:: Transpose{<:Any,<:StridedMatrix} , x:: AbstractSparseVector{Tx} ) where {Tx,Ty} =
1543- (A = transA . parent; mul! (y, transpose (A) , x, one (Tx), zero (Ty) ))
1542+ mul! (y, transA , x, one (Tx), zero (Ty))
15441543
15451544function mul! (y:: AbstractVector , transA:: Transpose{<:Any,<:StridedMatrix} , x:: AbstractSparseVector , α:: Number , β:: Number )
1545+ require_one_based_indexing (y, transA, x)
1546+ m, n = size (transA)
1547+ length (x) == n && length (y) == m || throw (DimensionMismatch ())
1548+ m == 0 && return y
1549+ if β != one (β)
1550+ β == zero (β) ? fill! (y, zero (eltype (y))) : rmul! (y, β)
1551+ end
1552+ α == zero (α) && return y
1553+
1554+ xnzind = nonzeroinds (x)
1555+ xnzval = nonzeros (x)
1556+ _nnz = length (xnzind)
1557+ _nnz == 0 && return y
1558+
15461559 A = transA. parent
1547- require_one_based_indexing (y, A, x)
1548- m, n = size (A)
1549- length (x) == m && length (y) == n || throw (DimensionMismatch ())
1550- n == 0 && return y
1560+ Ty = promote_op (matprod, eltype (A), eltype (x))
1561+ @inbounds for j = 1 : m
1562+ s = zero (Ty)
1563+ for i = 1 : _nnz
1564+ s += transpose (A[xnzind[i], j]) * xnzval[i]
1565+ end
1566+ y[j] += s * α
1567+ end
1568+ return y
1569+ end
1570+
1571+ # * and mul!(C, adjoint(A), B)
1572+
1573+ function * (adjA:: Adjoint{<:Any,<:StridedMatrix{Ta}} , x:: AbstractSparseVector{Tx} ) where {Ta,Tx}
1574+ require_one_based_indexing (adjA, x)
1575+ m, n = size (adjA)
1576+ length (x) == n || throw (DimensionMismatch ())
1577+ Ty = promote_op (matprod, Ta, Tx)
1578+ y = Vector {Ty} (undef, m)
1579+ mul! (y, adjA, x)
1580+ end
1581+
1582+ mul! (y:: AbstractVector{Ty} , adjA:: Adjoint{<:Any,<:StridedMatrix} , x:: AbstractSparseVector{Tx} ) where {Tx,Ty} =
1583+ mul! (y, adjA, x, one (Tx), zero (Ty))
1584+
1585+ function mul! (y:: AbstractVector , adjA:: Adjoint{<:Any,<:StridedMatrix} , x:: AbstractSparseVector , α:: Number , β:: Number )
1586+ require_one_based_indexing (y, adjA, x)
1587+ m, n = size (adjA)
1588+ length (x) == n && length (y) == m || throw (DimensionMismatch ())
1589+ m == 0 && return y
15511590 if β != one (β)
15521591 β == zero (β) ? fill! (y, zero (eltype (y))) : rmul! (y, β)
15531592 end
@@ -1558,11 +1597,12 @@ function mul!(y::AbstractVector, transA::Transpose{<:Any,<:StridedMatrix}, x::Ab
15581597 _nnz = length (xnzind)
15591598 _nnz == 0 && return y
15601599
1561- s0 = zero (eltype (A)) * zero (eltype (x))
1562- @inbounds for j = 1 : n
1563- s = zero (s0)
1600+ A = adjA. parent
1601+ Ty = promote_op (matprod, eltype (A), eltype (x))
1602+ @inbounds for j = 1 : m
1603+ s = zero (Ty)
15641604 for i = 1 : _nnz
1565- s += A[xnzind[i], j] * xnzval[i]
1605+ s += adjoint ( A[xnzind[i], j]) * xnzval[i]
15661606 end
15671607 y[j] += s * α
15681608 end
0 commit comments