Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matlab 3d-matrix

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?

like image 611
Scipion Avatar asked Sep 28 '12 15:09

Scipion


1 Answers

Matlab only has support for sparse matrices (2D). For 3D tensors/arrays, you'll have to use a workaround. I can think of two:

  1. linear indexing
  2. cell arrays

Linear indexing

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.

Cell arrays

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.

like image 113
Rody Oldenhuis Avatar answered Oct 17 '22 11:10

Rody Oldenhuis