Modifying a large sparse matrix efficiently
Mostrar comentarios más antiguos
I have a lot of zero elements in the matrix but I also I have a lot of elements that are small enough that I want to zero them out. What is the best way to do this? Keep in mind that it's a sparse matrix so if I index into this, wouldn't it take too much time? If I convert it back to a full matrix, that may not be memory efficient too.
Respuesta aceptada
Más respuestas (3)
Walter Roberson
el 12 de Mzo. de 2013
tol = 0.001;
[i, j, s] = find(YourSparseMatrix);
idx = abs(s) < tol;
i(idx) = [];
j(idx) = [];
s(idx) = [];
YourSparseMatrix = sparse(i, j, s); %write over it with new sparse matrix
James Tursa
el 14 de Mzo. de 2013
1 voto
I couldn't resist making a small mex function to do this. In addition to zeroing out small values, it can zero out values within a user-defined range (not necessarily small) and zero out or replace nan values. Works with real or complex matrices, and can generate a new matrix result or operate in-place. For in-place operations, it will throw an error if matrix is shared to avoid unintended side effects (but this behavior can be over-ridden). You can find it here:
The advantage of this mex implementation is that it doesn't generate potentially large intermediate arrays to get the job done.
Azzi Abdelmalek
el 12 de Mzo. de 2013
Define your tolerence tol
tol=0.001
a(abs(a)<tol))=0
1 comentario
No, that will be very slow and memory consuming, because abs(a)<tol will include all the many many zero entries of a, too. It will generate a very large and dense logical matrix (still in sparse form, though) with 1's in place of all the 0's of a.
Categorías
Más información sobre Sparse Matrices en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!