Replacing a LOT of data by zero (in a matrix)

2 visualizaciones (últimos 30 días)
Herwig Peters
Herwig Peters el 31 de Ag. de 2011
I have a matrix M1, below you see the whos information for that matrix:
Name Size Bytes Class Attributes M1 29624x29624 108387640 double sparse
I want to replace quite a bit of data by zeros, using logical indexing: M1(abs(M1)<1e-1) = 0;
This needs more than 16GB memory, there must be a more efficient way. I also tried the other way round, that is M1 = M1(abs(M1)>1e-1);
Same problem. What's the trick?

Respuesta aceptada

Herwig Peters
Herwig Peters el 31 de Ag. de 2011
4 way.
Find the indices of the desired matrix elements and the desired matrix elements themselves. With these 3 vectors, rebuild the sparse Matrix M1.
[i1,~,s1] = find(M1(abs(M1)>1e-1));
[i1,j1] = ind2sub(size(M1),i1);
M1 = sparse(i1,j1,s1,m,n);
  2 comentarios
Fangjun Jiang
Fangjun Jiang el 31 de Ag. de 2011
Nicely done! +1
Herwig Peters
Herwig Peters el 31 de Ag. de 2011
Actually, I just found it can be done even nicer:
M1 = (abs(M1)>1e-1).*M1;

Iniciar sesión para comentar.

Más respuestas (1)

Dmitry Borovoy
Dmitry Borovoy el 31 de Ag. de 2011
1 way. Use vectorization (your way). fast but requires a lot of RAM 2 way. Use loops. Very slow but no need a lot of RAM 3 way. For perverts. Write your code on C/C++/Fortran with loop and call it from Matlab. If you have restriction on RAM or on calculation speed, I suppose, it's your way.
  1 comentario
Herwig Peters
Herwig Peters el 31 de Ag. de 2011
Yes, that sums it up pretty well. 1 needs too much RAM, 2 needs too much time (CPU) and 3 needs too much time as well, my time.
See my own answer for another possibility.

Iniciar sesión para comentar.

Categorías

Más información sobre Matrix Indexing en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by