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
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.
Since your matrix is sparse, try to use ndsparse (N-dimensional sparse arrays FEX)