Convert cell array of cell arrays to matrix of matrices

后端 未结 5 1389
一向
一向 2021-01-05 05:37

I can convert a cell array of matrices to matrix:

>> C={[1,1]; [2,2]; [3,3]};
>> cell2mat(C)
ans =
     1     1
     2     2
     3     3
         


        
5条回答
  •  猫巷女王i
    2021-01-05 05:52

    To be honest, I never liked cell2mat for being slow, so I've come up an alternative solution using comma-separated lists instead!

    Transform a cell array of vectors

    This is fairly simple, just use the colon operator and concatenate all vectors vertically:

    C = {[1,1]; [2,2]; [3,3]};
    A = vertcat(C{:})
    

    and so we get:

    A =
        1   1
        2   2
        3   3
    

    Transform a cell array of cell arrays

    This is a bit trickier. Since it's a cell array of cell arrays, we'll have to obtain a vector of all elements by a double use of the colon and horzcat, and then reshape it into the desired matrix.

    C = {{1,1}; {2,2}; {3,3}};
    V = [size(C{1}), 1]; V(find(V == 1, 1)) = numel(C);
    A = reshape([horzcat(C{:}){:}], V)
    

    and so we get:

    A =
        1   1
        2   2
        3   3
    

    The manipulation of V makes sure that A is reshaped correctly without having to specify the output dimensions explicitly (unfortunately, I didn't find a one liner for this). This also works for multi-dimensional cell arrays as well:

    C = {{1, 1; 1, 1}; {2, 2; 2, 2}; {3, 3; 3, 3}};
    V = [size(C{1}), 1]; V(find(V == 1, 1)) = numel(C);
    A = reshape([horzcat(C{:}){:}], V)
    
    A(:,:,1) = 
        1   1
        1   1
    
    A(:,:,2) =   
        2   2
        2   2
    
    A(:,:,3) =    
        3   3
        3   3
    

    P.S

    I think the correct result for the last example should be a 6-by-2 matrix instead of a 2-by-2-by-3. However, that is not what you requested, so it's off-topic.

提交回复
热议问题