oh cool that's convenient, for some reason the nzrange function isn't mentioned in the documentation.
On Friday, April 1, 2016 at 2:46:53 AM UTC-7, Mauro wrote: > > On Fri, 2016-04-01 at 11:07, Anonymous <esp...@gmail.com <javascript:>> > wrote: > > but what if I need to access the coordinates of the nonzero entries of a > > sparse matrix for some reason? Is there a faster way to do it than > using > > my colvals function? > > help?> nzrange > search: nzrange > > nzrange(A, col) > > Return the range of indices to the structural nonzero values of a sparse > matrix column. In conjunction with nonzeros(A) and rowvals(A), this allows > for convenient > iterating over a sparse matrix : > > A = sparse(I,J,V) > rows = rowvals(A) > vals = nonzeros(A) > m, n = size(A) > for i = 1:n > for j in nzrange(A, i) > row = rows[j] > val = vals[j] > # perform sparse wizardry... > end > end > > So this gives all the indices of the non-zeros: > > A = sparse(I,J,V) > rows = rowvals(A) > m, n = size(A) > for i = 1:n > col_ind = i > for j in nzrange(A, i) > row_ind = rows[j] > # perform sparse wizardry... > end > end > > > > On Friday, April 1, 2016 at 2:03:31 AM UTC-7, Mauro wrote: > >> > >> The reason rowvals exists is to access the vector of row-indices of a > >> CSC-matrix, i.e. one of the internals of CSC, to allow efficient > >> iteration over the non-zeros. However, there is no equivalent colvals > >> internal, so there is little reason to do this and even less reason to > >> encourage it. Consider: > >> > >> julia> s = sprand(10^7, 10^7, 1e-7); > >> > >> julia> @time rowvals(s); > >> 0.000004 seconds (4 allocations: 160 bytes) > >> > >> julia> @time colvals(s); > >> 0.508060 seconds (20 allocations: 533.748 MB, 14.61% gc time) > >> > >> > >> On Fri, 2016-04-01 at 10:48, Anonymous <esp...@gmail.com > <javascript:>> > >> wrote: > >> > There is a rowals function, and then there is a find function, and > the > >> find > >> > function actually allows you to write a one line colvals function: > >> > > >> > colvals(S::SparseMatrixCSC) = round(Int, floor(find(S)/(size(S, > >> 1)+0.1))+1) > >> > > >> > shouldn't someone add this to base? > >> >