For reference, here's the long discussion that happened before making
that change:
https://github.com/JuliaLang/julia/pull/16371

Indeed I think Tony was right that this has undesirable consequences in
terms of usability. Not being able to use the same in-place API for
dense and sparse matrices is a no-go IMHO.


Regards

Le samedi 05 novembre 2016 à 20:11 -0700, vava...@uwaterloo.ca a
écrit :
> Just to clarify, you don't actually need to allocate the memory for
> two large sparse matrices.  You can change colptr, rowval, and nzval
> in place (as you have already done) and then create a new sparse
> matrix using these modified arrays.  In this case, the arrays won't
> be copied over; instead the new sparse matrix will get a pointer to
> the already-allocated arrays.  This technique could lead to some
> subtle program bugs (because if two sparse matrices share an nzval
> array, then any change to one affects the other), but you can guard
> against this by making the old matrix's name inaccessible, for
> instance, by giving the new matrix the same name as the old one.
> 
> -- Steve Vavasis
> 
> 
> > I see. returning a new, smaller instance of the matrix was my
> > temporary solution. Bummer that it's necessary... Is it really so
> > strange to want to change the size of a 
> > 
> > Another alternative which occurs to me is to make some child class
> > of SparseCSCMatrix with two more arrays, each with one element,
> > which track the sizes? Since I am making the matrix smaller, not
> > larger, I can't imagine that this would be an issue. However, if I
> > need to allocate two large sparse matrices just to remove a row/col
> > pair, then I can suddenly use half the memory I could before...
> > 
> > 
> > > When a type is immutable, that means you can't modify the data in
> > > the type.  If a field of a type is mutable, a reference to it is
> > > stored in the type, and you cannot modify that reference.  In the
> > > case of SparseMatrixCSC, that means you can't make A.colptr point
> > > to a different array, for example.  You are still free to change
> > > the values in A.colptr, because that does not require modifying
> > > the reference.  If the field is immutable, then the value itself
> > > is stored in the type, not a reference to the value, and you
> > > cannot modify the value.  That's why you get the error in the
> > > example.
> > > 
> > > The best solution I can think of for your rmCol example is to
> > > create a new SparseMatrixCSC that uses the same arrays as the old
> > > one (to avoid increasing memory usage) and return it.  Replacing
> > > the last line of rmCol with:
> > > 
> > >   SparseMatrixCSC(m, n-1, A.colptr, A.rowval, A.nzval)
> > > 
> > >   should do the trick.  The only sticky point is that the
> > > original A now contains invalid data, so you'll have to make sure
> > > only the the matrix returned from rmCol is used in the future,
> > > not the original A.
> > > 
> > >   Jared Crean
> > > 
> > > 
> > > > The SparseMatrixCSC type is immutable, which I understand to
> > > > mean that I must respect the types of the attributes of
> > > > SparseMatrixCSC types, as well as not changing the attributes
> > > > themselves.
> > > > 
> > > > The following gives a loadError (type is immutable).  I am
> > > > confused that I can modify the colptr and rowval attributes of
> > > > A, but not the A.n attribute. Why is this? I am trying to
> > > > change the size of a sparse matrix after removing the data from
> > > > a row and column.
> > > > 
> > > > I have checked that both A.n and A.n - 1 are type Int.
> > > > 
> > > > function rmCol(A::SparseMatrixCSC, rmCol::Int)
> > > >     colRmRange = A.colptr[rmCol]:(A.colptr[rmCol+1]-1)
> > > >     filter!(e -> e != rmCol, A.colptr)
> > > >     
> > > >     deleteat!(A.rowval, rowval[colRmRange])
> > > >     deleteat!(A.nzval, colRmRange)
> > > >     A.n -= 1 # inclusion of this line throws error
> > > >     
> > > > end
> > > > 
> > > 
> > 

Reply via email to