matrix pre-allocation
古いコメントを表示
What's actually the difference between the following commands
sparse(zeros(10000));
sparse([],[],[],10000,10000,0);
a = sparse([]); for i =1:10000,for j = 1:10000, a(i,j) = 0,end,end
Oftentimes the first line leads to out-of-memory problem while the rest do not when the dimension acretes.
I consulted to some tutorial about memory allocation that says "loop" is at times useful to speed up and avoid memory outflow.
When should I use loop to generate a really "big" matrix? or the second line just dominates?
Thanks
採用された回答
その他の回答 (1 件)
Matt Fig
2011 年 4 月 13 日
1 投票
There are cases where loops are much faster than other alternatives. This can sometimes be difficult to predict ahead of time, however, when a loop is not a good idea is often easier to identify. In general:
1. Growing an array in a loop will always be your slowest option. The case you show above where a starts out empty and grows in a loop is going to be the slowest option.
2. The more complicated the indexing maneuvers in a loop, the slower it will be. Simple looping over consecutive elements in existing arrays will be fast.
3. A loop which makes many M-file function calls will be slow compared to a vectorized code. For speed, look for only a minimum of built-in calls within a loop.
4. These guidelines stand out more as the size of the arrays involved grows. For example, not pre-allocating a 1-by-5 array is no big deal, but a 1-by-5e7 array will slow down the code.
In your three examples above, the first example is a good demonstration of how not to pre-allocate a sparse array, as you found out. Your second example generates the ultimate sparse array - 0% density. I don't know enough about sparse arrays to know if this actually pre-allocates any memory at all. The third example is bad whether dealing with sparse arrays or not because you are growing and array in a loop.
4 件のコメント
Andrew Newell
2011 年 4 月 13 日
It probably doesn't pre-allocate any memory because the time involved doesn't depend on the array size.
Matt Fig
2011 年 4 月 13 日
That's what I was thinking. The idea of pre-allocating memory for a sparse array just seems goofy to me.
Chien-Chia Huang
2011 年 4 月 13 日
Wolfgang Schwanghart
2011 年 4 月 13 日
You can preallocate sparse arrays using the sixth input argument of sparse or the function spalloc.
カテゴリ
ヘルプ センター および File Exchange で Creating and Concatenating Matrices についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!