I'm trying to find the column indices of non-zero elements of a given row in a sparse matrix A
I figured using findn would be a fast way to do that, but I was curious to see how the implementation was done since all I cared about were the columns for a given row and I thought I could have my own version that only checked for a given row. But when I took a peek in https://github.com/JuliaLang/julia/blob/master/base/sparse/sparsematrix.jl#L310 I was surprised to see this in findn (and findnz) S.nzval[k] != 0 I would have expected nzval to always be != 0 by construction? Then I had a look at nnz and countnz, and I was again surprised to see that they have slightly different implementations! Especially given the help for the two functions (which makes sense since one expects all stored elements in the sparse matrix to be non-zero) help?> nnz > Base.nnz(A) > Returns the number of stored (filled) elements in a sparse matrix. > help?> countnz > Base.countnz(A) > Counts the number of nonzero values in array A (dense or sparse). > Note that this is not a constant-time operation. For sparse > matrices, one should usually use "nnz", which returns the number > of stored values. The only way I can see that happening, is if the user manually modifies nzval? i.e. A = spdiagm(ones(5)); println(nnz(A), countnz(A)) #prints 55 A[1,1] = 0 println(nnz(A), countnz(A)) #prints 44 A.nzval[1] = 0 println(nnz(A), countnz(A)) #prints 43 So few questions: - what is the fastet way to do what I was initially trying to accomplish: find the column indices and values of a given row in a sparse matrix A - why the checking of nzval? - is that because it's ok to change nzval manually? if not, why is nzval not "protected" ? Thanks, -z
