I have to create a very big 3D matrix (such as: 500000x60x60
). Is there any way to do this in matlab?
When I try
omega = zeros(500000,60,60,'single');
I get an out-of-memory
error.
The sparse function is no option since it is only meant for 2D matrices. So is there any alternative to that for higher dimensional matrices?
Matlab only has support for sparse matrices (2D). For 3D tensors/arrays, you'll have to use a workaround. I can think of two:
You can create a sparse vector like so:
A = spalloc(500000*60*60, 1, 100);
where the last entry (100
) refers to the amount of non-zeros eventually to be assigned to A
. If you know this amount beforehand it makes memory usage for A
more efficient. If you don't know it beforehand just use some number close to it, it'll still work, but A
can consume more memory in the end than it strictly needs to.
Then you can refer to elements as if it is a 3D array like so:
A(sub2ind(size(A), i,j,k))
where i
, j
and k
are the indices to the 1st, 2nd and 3rd dimension, respectively.
Create each 2D page in the 3D tensor/array as a cell array:
a = cellfun(@(x) spalloc(500000, 60, 100), cell(60,1), 'UniformOutput', false);
The same story goes for this last entry into spalloc
. Then concatenate in 3D like so:
A = cat(3, a{:});
then you can refer to individual elements like so:
A{i,j,k}
where i
, j
and k
are the indices to the 1st, 2nd and 3rd dimension, respectively.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With