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

2 ビュー (過去 30 日間)
Herwig Peters
Herwig Peters 2011 年 8 月 31 日
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?

採用された回答

Herwig Peters
Herwig Peters 2011 年 8 月 31 日
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 件のコメント
Fangjun Jiang
Fangjun Jiang 2011 年 8 月 31 日
Nicely done! +1
Herwig Peters
Herwig Peters 2011 年 8 月 31 日
Actually, I just found it can be done even nicer:
M1 = (abs(M1)>1e-1).*M1;

サインインしてコメントする。

その他の回答 (1 件)

Dmitry Borovoy
Dmitry Borovoy 2011 年 8 月 31 日
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 件のコメント
Herwig Peters
Herwig Peters 2011 年 8 月 31 日
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.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by