我想找到一种简单的方法将包含矩阵的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];
答案 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{:}].';