Matlab 3d-matrix

前端 未结 2 1982
长情又很酷
长情又很酷 2021-01-12 13:50

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         


        
相关标签:
2条回答
  • 2021-01-12 14:43

    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.

    0 讨论(0)
  • 2021-01-12 14:49

    Since your matrix is sparse, try to use ndsparse (N-dimensional sparse arrays FEX)

    0 讨论(0)
提交回复
热议问题