preallocating sparse 4d matrix
Mostrar comentarios más antiguos
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 comentarios
Walter Roberson
el 7 de Mzo. de 2013
Could you use 'float' or even one of the integer data types instead of double for L ?
Michael
el 7 de Mzo. de 2013
Walter Roberson
el 7 de Mzo. de 2013
Editada: Walter Roberson
el 7 de Mzo. de 2013
L = zeros(50,50,50,50, 'uint8');
Though if you want negatives, you will want 'int8' instead of 'uint8' :)
Michael
el 7 de Mzo. de 2013
Walter Roberson
el 7 de Mzo. de 2013
Editada: Walter Roberson
el 7 de Mzo. de 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()
Respuesta aceptada
Más respuestas (1)
Teja Muppirala
el 7 de Mzo. de 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
Categorías
Más información sobre Creating and Concatenating 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!