how to build many sparse matrices

7 Ansichten (letzte 30 Tage)
Melody
Melody am 13 Sep. 2018
Bearbeitet: Melody am 16 Sep. 2018
I wish to create m = 10^5 sparse matrices of size n by n, say n = 10^4. I have been using
A = cell(m, 1);
for i = 1:m
row = ...; col = ...; val = ...; % here ... means some certain assignment in column vectors
A{i} = sparse(row, col, val, n, n);
end
But it is too slow. So I tried to use the types ndSparse (https://www.mathworks.com/matlabcentral/fileexchange/29832-n-dimensional-sparse-arrays) and sptensor (https://www.sandia.gov/~tgkolda/TensorToolbox/index-2.6.html). They do the job fast by creating m matrices all at once in 3d (n*n*m). It requires concatenating index and value vectors, where the speed is acceptable. However, I then need individual matrices for some operations that do NOT work on types ndSparse and sptensor. For example,
[R, p] = chol(A(:, :, i));
does not work. If I convert the object to Matlab sparse type as
[R, p] = chol(sparse(A(:, :, i)));
then it is even slower than creating A one by one in the for loop. Considering that Matlab does not support multidimensional sparse arrays (so I cannot reshape the abovementioned types into Matlab sparse tensor), how can I speed up creating m sparse matrices? Thank you!
  1 Kommentar
Steven Lord
Steven Lord am 13 Sep. 2018
How are you planning to use those 1e5 sparse matrices later in your code? I want to see if it is possible to reduce the number of sparse matrices you need to create while still achieving your ultimate goal by using a different approach or algorithm.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Matt J
Matt J am 13 Sep. 2018
Bearbeitet: Matt J am 13 Sep. 2018
Once you have A in ndSparse form, you can then split it into the cell array form you were originally trying to get using mat2cell:
Ar=sparse( reshape(A,n,m*n) );
Acell=mat2cell(Ar,n,ones(1,m)*n);
and then
[R, p] = chol(Acell{i});
  9 Kommentare
Melody
Melody am 15 Sep. 2018
I've been trying to think of a way to not use them simultaneously but haven't found a solution. However I found a way to work around building big sparse matrix (thanks for reminding me that even empty big sparse matrix can take up a lot of memory):
[C, ~, ic] = unique([row{i}; col{i}]);
len_C = length(C);
len_ic2 = length(ic)/2;
Ai = sparse(ic, [ic((len_ic2 + 1):end); ic(1:len_ic2)], val{i}, len_C, len_C);
This works for all my operations. However, the "unique" function in the first line above takes even more time than before... Is there any way to make it faster?
Melody
Melody am 16 Sep. 2018
Bearbeitet: Melody am 16 Sep. 2018
I came up with a way to not keep all matrices at the same time, and codes as in the 3rd comment in this answer seem to save 50% time for the large data. Thank you!
May I know what the proper way to include "ndSparse.m" in my software is? Is it enough to include "license.txt" and cite the webpage "https://www.mathworks.com/matlabcentral/fileexchange/29832-n-dimensional-sparse-arrays" in my document?

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Matt J
Matt J am 13 Sep. 2018
Bearbeitet: Matt J am 13 Sep. 2018
It might also be a good idea, instead of constructing a 3D sparse array or a cell array of separate matrices, to instead create a big block diagonal matrix, where each n x n matrix is one of the diagonal blocks. That way you can do the entire Cholesky decomposition in a single call to CHOL.
  4 Kommentare
Matt J
Matt J am 13 Sep. 2018
What are the densities of these matrices nnz(A)/numel(A) ?
Melody
Melody am 13 Sep. 2018
Very sparse -- less then 10 nonzero elements for each matrix.

Melden Sie sich an, um zu kommentieren.


Christine Tobler
Christine Tobler am 13 Sep. 2018
The sparse function will often be faster if the second input, col, is sorted in ascending order. If you can cheaply construct col in a way that this is the case, that should help a bit with performance.
  1 Kommentar
Melody
Melody am 14 Sep. 2018
Thank you for your advice! It may probably work well with denser matrices, but my matrices only have less than 10 nonzero entries each, so sorting them then creating the sparse matrix actually takes more time. :(

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Creating and Concatenating Matrices finden Sie in Help Center und File Exchange

Produkte


Version

R2015a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by