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...


On Saturday, November 5, 2016 at 7:42:55 PM UTC-4, Jared Crean wrote:
>
> 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
>
>
> On Saturday, November 5, 2016 at 5:07:45 PM UTC-4, Corbin Foucart wrote:
>>
>> 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