将包含矩阵的单元格转换为2d矩阵

时间:2017-09-15 14:11:08

标签: matlab matrix cell

我想找到一种简单的方法将包含矩阵的1x324单元阵列转换为二维矩阵。

每个单元阵列的元素都是大小为27x94的矩阵,因此它们包含2538个不同的值。我想将这个矩阵的单元格数组转换为324x2538矩阵 - 其中输出的行包含来自单元格数组的每个矩阵(作为行向量)。

为了阐明我的数据是什么样的以及我想要创建的内容,请参阅此示例:

matrix1 = [1,2,3,4,...,94 ; 95,96,97,... ; 2445,2446,2447,...,2538]; % (27x94 matrix)
% ... other matrices are similar
A = {matrix1, matrix2, matrix3, ..., matrix324}; % Matrices are in 1st row of cell array

我想要得到的东西:

% 324x2538 output matrix
B = [1     , 2   ,   ..., 2538  ;  % matrix1
     2539  , 2540,   ..., 5076  ;  % matrix2
     ...   
     819775, 819776, ..., 822312]; 

3 个答案:

答案 0 :(得分:3)

cell2mat函数就是这样做的。文档示例:

C = {[1],    [2 3 4];
     [5; 9], [6 7 8; 10 11 12]};
A = cell2mat(C)
A = 

     1     2     3     4
     5     6     7     8
     9    10    11    12

你现在有了你的矩阵,所以只需重做它就可以包含行:

B = rand(27,302456); % your B
D = reshape(B,27,94,324); % stack your matrices to 3D
E = reshape(D,1, 2538,324); % reshape each slice to a row vector
E = permute(E,[3 2 1]); % permute the dimensions to the correct order
% Based on sizes instead of fixed numbers
% D = reshape(B, [size(A{1}) numel(A)]);
% E = reshape(D,[1 prod(size(A{1})) numel(A)]);
% E = permute(E,[3 2 1]); % permute the dimensions to the correct order

或者,从B

到一行
B = reshape(B,prod(size(A{1})),numel(A)).'

答案 1 :(得分:0)

现在我找到了解决方案,如果有人在将来遇到类似问题,我会在此处添加:

for ii = 1:length(A)
    B{ii} = A{ii}(:);
end
B = cell2mat(B).';

答案 2 :(得分:0)

写这个的一种方法是使用cellfun对单元格的每个元素进行操作,然后连接结果。

% Using your input cell array A, turn all matrices into column vectors
% You need shiftdim so that the result is e.g. [1 2 3 4] not [1 3 2 4] for [1 2; 3 4]
B = cellfun(@(r) reshape(shiftdim(r,1),[],1), A, 'uniformoutput', false);
% Stack all columns vectors together then transpose
B = [B{:}].';