excellent point your function was indeed about 4x faster, but Kristophers was about 100x :O so i'll stick to his
On Monday, February 1, 2016 at 6:56:56 AM UTC-8, Erik Schnetter wrote: > > Compare this function: > > ```Julia > function f2(k) > M = spzeros(2*k,2*k) > for i = 1:k > j1 = (i-1)*2+1 > j2 = i*2 > M[j1,j1] = rand() > M[j2,j1] = rand() > M[j1,j2] = rand() > M[j2,j2] = rand() > end > return M > end > ``` > which is much faster. It seems your original code has two performance > issues that are unrelated to sparse matrix memory allocation: > (1) `randn` allocates a new matrix every time > (2) Something about indexing sparse matrices with ranges seems slow (I > don't know why) > > If you want to continue to use `randn`, then you can use `randn!` > instead, and preallocate the small matrix outside the loop. > > -erik > > > On Mon, Feb 1, 2016 at 9:42 AM, Kristoffer Carlsson > <[email protected] <javascript:>> wrote: > >> However doing in this way is more cumbersome because you need to have > a > >> good estimate of the number of entries > > > > Not true. The difference between pre allocating the arrays and just > pushing > > into them is not that large due to how julia arrays work (constant > > ammortized time etc). > > > > > > On Monday, February 1, 2016 at 1:34:12 PM UTC+1, alan souza wrote: > >> > >> You could try to use the triplet form (tree vectors containing the > row/col > >> indexes and the value of the entry) and call the function sparse. > >> In this way you can preallocate in advance these three vectors. > >> However doing in this way is more cumbersome because you need to have > a > >> good estimate of the number of entries and to explicitly calculate the > index > >> for all entries. > >> > >> On Sunday, January 31, 2016 at 8:07:56 PM UTC-2, Gabriel Goh wrote: > >>> > >>> Generating a sparse matrix from scratch seems to be quite memory > >>> intensive. and slow. Say I wish to create a large block diagonal > matrix with > >>> 2x2 block entries. > >>> > >>> Doing it naively is quite slow > >>> > >>> function f(k) > >>> M = spzeros(2*k,2*k) > >>> for i = 1:k > >>> D = (i-1)*2 + 1:i*2 > >>> M[D,D] = randn(2,2) > >>> end > >>> return M > >>> end > >>> > >>> julia> @time f(10000) > >>> 2.534277 seconds (239.26 k allocations: 3.013 GB, 15.58% gc time) > >>> > >>> Is there a way to speed this up by preallocating the memory somehow? > > > > -- > Erik Schnetter <[email protected] <javascript:>> > http://www.perimeterinstitute.ca/personal/eschnetter/ >
