@Viral, because findn explicitly checks whether all stored entries are != 0
which seems unnecessary.

As posted on the github discussion, I ended up doing this since I realized
that Julia is using CSC instead of CSR, so finding the rows for a given
column is easier. So I'm just going to store the transpose of the matrix I
care about and use this instead:

#Returns row indices for non-zero entries in a given column
function findn_rows{Tv,Ti}(S::SparseMatrixCSC{Tv,Ti}, colIdx::Integer)
    return S.rowval[S.colptr[colIdx] : (S.colptr[colIdx+1]-1)]
end


Thanks,
-z


On Sat, Feb 14, 2015 at 1:33 AM, Viral Shah <[email protected]> wrote:

> If your sparse matrix does not have any stored zeros, which it should not
> unless you have placed them yourself - this should not matter. Why do you
> want to write your own findn?
>
> -viral
>
>
> On Saturday, February 14, 2015 at 12:15:57 AM UTC+5:30, Zouhair Mahboubi
> wrote:
>>
>> Thanks for the clarficiation Mauro, although it seems like right now
>> Julia is somewhere in between the two approaches according to that thread.
>>
>> I guess I'll just have to write my own version of findn which assumes
>> that zeros have been purged, and if they haven't it's not that big of a
>> deal in my application.
>>
>> Thanks again,
>> -z
>>
>> On Thu, Feb 12, 2015 at 11:05 PM, Mauro <[email protected]> wrote:
>>
>>> There was some discussion about this in
>>> https://github.com/JuliaLang/julia/issues/9928
>>>
>>> There are merits to both approaches: keeping zeros and purging them.
>>>
>>> On Fri, 2015-02-13 at 05:03, Zouhair Mahboubi <
>>> [email protected]> wrote:
>>> > 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
>>>
>>>
>>

Reply via email to