13
13
function A_mul_B! (α:: Number , A:: SparseMatrixCSC , x:: AbstractVector , β:: Number , y:: AbstractVector )
14
14
A. n == length (x) || throw (DimensionMismatch (" " ))
15
15
A. m == length (y) || throw (DimensionMismatch (" " ))
16
- for i = 1 : A. m; y[i] *= β; end
16
+ if β != 1
17
+ β != 0 ? scale! (y,β) : fill! (y,zero (eltype (y)))
18
+ end
17
19
nzv = A. nzval
18
20
rv = A. rowval
19
21
for col = 1 : A. n
@@ -28,17 +30,24 @@ A_mul_B!(y::AbstractVector, A::SparseMatrixCSC, x::AbstractVector) = A_mul_B!(on
28
30
29
31
function * {TA,S,Tx}(A:: SparseMatrixCSC{TA,S} , x:: AbstractVector{Tx} )
30
32
T = promote_type (TA,Tx)
31
- A_mul_B! (one (T), A, x, zero (T), zeros (T, A. m))
33
+ A_mul_B! (one (T), A, x, zero (T), Array (T, A. m))
32
34
end
33
35
34
36
function Ac_mul_B! (α:: Number , A:: SparseMatrixCSC , x:: AbstractVector , β:: Number , y:: AbstractVector )
35
37
A. n == length (y) || throw (DimensionMismatch (" " ))
36
38
A. m == length (x) || throw (DimensionMismatch (" " ))
37
39
nzv = A. nzval
38
40
rv = A. rowval
41
+ zro = zero (eltype (y))
39
42
@inbounds begin
40
43
for i = 1 : A. n
41
- y[i] *= β
44
+ if β != 1
45
+ if β != 0
46
+ y[i] *= β
47
+ else
48
+ y[i] = zro
49
+ end
50
+ end
42
51
tmp = zero (eltype (y))
43
52
for j = A. colptr[i] : (A. colptr[i+ 1 ]- 1 )
44
53
tmp += conj (nzv[j])* x[rv[j]]
@@ -54,9 +63,16 @@ function At_mul_B!(α::Number, A::SparseMatrixCSC, x::AbstractVector, β::Number
54
63
A. m == length (x) || throw (DimensionMismatch (" " ))
55
64
nzv = A. nzval
56
65
rv = A. rowval
66
+ zro = zero (eltype (y))
57
67
@inbounds begin
58
68
for i = 1 : A. n
59
- y[i] *= β
69
+ if β != 1
70
+ if β != 0
71
+ y[i] *= β
72
+ else
73
+ y[i] = zro
74
+ end
75
+ end
60
76
tmp = zero (eltype (y))
61
77
for j = A. colptr[i] : (A. colptr[i+ 1 ]- 1 )
62
78
tmp += nzv[j]* x[rv[j]]
69
85
At_mul_B! (y:: AbstractVector , A:: SparseMatrixCSC , x:: AbstractVector ) = At_mul_B! (one (eltype (x)), A, x, zero (eltype (y)), y)
70
86
function Ac_mul_B {TA,S,Tx} (A:: SparseMatrixCSC{TA,S} , x:: AbstractVector{Tx} )
71
87
T = promote_type (TA, Tx)
72
- Ac_mul_B! (one (T), A, x, zero (T), zeros (T, A. n))
88
+ Ac_mul_B! (one (T), A, x, zero (T), Array (T, A. n))
73
89
end
74
90
function At_mul_B {TA,S,Tx} (A:: SparseMatrixCSC{TA,S} , x:: AbstractVector{Tx} )
75
91
T = promote_type (TA, Tx)
76
- At_mul_B! (one (T), A, x, zero (T), zeros (T, A. n))
92
+ At_mul_B! (one (T), A, x, zero (T), Array (T, A. n))
77
93
end
78
94
79
95
* (X:: BitArray{1} , A:: SparseMatrixCSC ) = invoke (* , (AbstractVector, SparseMatrixCSC), X, A)
0 commit comments