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:
Linear indexing
You can create a sparse vector like so:
where the last entry (
100
) refers to the amount of non-zeros eventually to be assigned toA
. If you know this amount beforehand it makes memory usage forA
more efficient. If you don't know it beforehand just use some number close to it, it'll still work, butA
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:
where
i
,j
andk
are the indices to the 1st, 2nd and 3rd dimension, respectively.Cell arrays
Create each 2D page in the 3D tensor/array as a cell array:
The same story goes for this last entry into
spalloc
. Then concatenate in 3D like so:then you can refer to individual elements like so:
where
i
,j
andk
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)