I am filling a sparse matrix P (230k,290k) with values coming from a text file which I read line by line, here is the (simplified) code
while ...
By far the fastest way to generate a sparse matrix wihtin matlab is to load all the values in at once, then generate the sparse matrix in one call to sparse
. You have to load the data and arrange it into vectors defining the row and column indices and values for each filled cell. You can then call sparse
using the S = sparse(i,j,s,m,n)
syntax.
There's a sixth input argument to sparse that tells the number of nonzero elements in the matrix. That's used by Matlab to preallocate:
S = sparse(i,j,s,m,n,nzmax)
uses vectorsi
,j
, ands
to generate anm
-by-n
sparse matrix such thatS(i(k),j(k)) = s(k)
, with space allocated fornzmax
nonzeros.
So you could initiallize with
P = sparse([],[],[],230e3,290e3,nzmax);
You can make a guess about the number of nonzeros (perhaps checking file size?) and use that as nzmax
. If it turns you need more nonzero elements in the end, Matlab will preallocate on the fly (slowly).