preallocating sparse 4d matrix
Show older comments
Hi
I've got some code that preallocates some matrix L = zeros(50,50,50,50); and then iterates along the first two dimensions (for i = 1:50, for j = 1:50...) to populate L. At the end of my code I reshape L into a 2500x2500 matrix, and this is it in usable form.
I want to increase the dimensions from 50 to 100, but it's hitting a memory bottleneck when preallocating, and I can't use spalloc to generate a 4d matrix. Rather than re-writing all my loops, can anyone think of another way to get around this? The end result (a sparse 10000x10000 matrix) should be easy to create, but I can't make it sparse until it's 2d, which is after my calculations.
Thanks for any help Mike
5 Comments
Walter Roberson
on 7 Mar 2013
Could you use 'float' or even one of the integer data types instead of double for L ?
Michael
on 7 Mar 2013
Walter Roberson
on 7 Mar 2013
Edited: Walter Roberson
on 7 Mar 2013
L = zeros(50,50,50,50, 'uint8');
Though if you want negatives, you will want 'int8' instead of 'uint8' :)
Michael
on 7 Mar 2013
Walter Roberson
on 7 Mar 2013
Edited: Walter Roberson
on 7 Mar 2013
Ah yes, sparse is restricted to double or uint8 (or logical, I think).
You could encode the negatives into uint8, e.g., 254 for -2 (which would be the two's complement to make it easier to track.) Doing the translation later might prove to be time consuming. It might be faster to record indices into a lookup table, and do something like
usedidx = find(L);
[idx1, idx2] = idx2subs([N*N, N*N], usedidx);
sparse(idx1, idx2, LookupTable(L(usedidx)), ...) %recheck arg order!
Notice I did an implicit reshape there by way of the first argument to idx2subs()
Accepted Answer
More Answers (1)
Teja Muppirala
on 7 Mar 2013
You can't make a sparse array with more than 2 dimensions, but you could make a 100x100 cell array that is filled with 100x100 sparse matrices. And then you can work on each cell separately, and then go back and shape it into a 10000x10000 afterwards.
L = repmat({sparse(100,100)} ,100,100);
for i = 1:100
for j = 1:100
L{i}{j} = ...
end
end
Categories
Find more on Creating and Concatenating Matrices in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!