diff --git a/base/linalg/sparse.jl b/base/linalg/sparse.jl index 3c13b607b4277..14c4c3081c923 100644 --- a/base/linalg/sparse.jl +++ b/base/linalg/sparse.jl @@ -598,9 +598,11 @@ function scale!{Tv,Ti}(C::SparseMatrixCSC{Tv,Ti}, A::SparseMatrixCSC, b::Vector) m, n = size(A) (n==length(b) && size(A)==size(C)) || throw(DimensionMismatch()) numnz = nnz(A) - C.colptr = convert(Array{Ti}, A.colptr) - C.rowval = convert(Array{Ti}, A.rowval) - C.nzval = Array(Tv, numnz) + if C !== A + C.colptr = convert(Array{Ti}, A.colptr) + C.rowval = convert(Array{Ti}, A.rowval) + C.nzval = Array(Tv, numnz) + end for col = 1:n, p = A.colptr[col]:(A.colptr[col+1]-1) C.nzval[p] = A.nzval[p] * b[col] end @@ -609,11 +611,13 @@ end function scale!{Tv,Ti}(C::SparseMatrixCSC{Tv,Ti}, b::Vector, A::SparseMatrixCSC) m, n = size(A) - (n==length(b) && size(A)==size(C)) || throw(DimensionMismatch()) + (m==length(b) && size(A)==size(C)) || throw(DimensionMismatch()) numnz = nnz(A) - C.colptr = convert(Array{Ti}, A.colptr) - C.rowval = convert(Array{Ti}, A.rowval) - C.nzval = Array(Tv, numnz) + if C !== A + C.colptr = convert(Array{Ti}, A.colptr) + C.rowval = convert(Array{Ti}, A.rowval) + C.nzval = Array(Tv, numnz) + end for col = 1:n, p = A.colptr[col]:(A.colptr[col+1]-1) C.nzval[p] = A.nzval[p] * b[A.rowval[p]] end diff --git a/test/sparse.jl b/test/sparse.jl index c18fd952b54d2..259742db7c62d 100644 --- a/test/sparse.jl +++ b/test/sparse.jl @@ -155,6 +155,16 @@ for i = 1:5 @test full(kron(a,b)) == kron(full(a), full(b)) end +# scale and scale! +sA = sprandn(3, 7, 0.5) +dA = full(sA) +b = randn(7) +@test scale(dA, b) == scale(sA, b) +@test scale(dA, b) == scale!(copy(sA), b) +b = randn(3) +@test scale(b, dA) == scale(b, sA) +@test scale(b, dA) == scale!(b, copy(sA)) + # reductions @test sum(se33)[1] == 3.0 @test sum(se33, 1) == [1.0 1.0 1.0]