sparse arrays - How to prevent a SparseArray entry from being specified when it coincides with the default value?
Mathematica doesn't notice when an entry coincides with the default value:
(IdentityMatrix[2, SparseArray] - IdentityMatrix[2, SparseArray])["NonzeroPositions"]
{{1, 1}, {2, 2}}
How to make it notice this?
Answer
As corey979 pointed out, wrap it with SparseArray
. Moreover, it is also discussed in the section "Possible Issues" in the documentation of SparseArray
.
In any cases, automatic "nullifying" of zero entries would harm performance as the internal structure of the sparse array (i.e., A["RowPointers"]
, A["ColumnIndices"]
, and A["NonzeroPositions"]
) would have to be recomputed. (Note that internally, SparseArray
s are stored in the CRS format. See also here for the Mathematica-specfic details.) As few zero-valued nonzero entries usually do not harm, it is a good thing to have it under user control.
There are even use cases in which an automatic "nullifying" of zero-valued nonzero entries would be harmful (although I cannot recall a case where that was an issue when using only in-built functions). For example, I frequently use the MKL Pardiso solver through library link. That enables me to factor a matrix A
, then change only the values of A
, and recycle most of the data that Pardiso computed internally -- provided that A["NonzeroPositions"]
does not change. That's very useful, e.g., for Newton's method. It would be a tedious task if Mathematica would "nullify" entries "at random".
Comments
Post a Comment