2017-09-15 1 views
-2

Je veux trouver un moyen facile de convertir un tableau de cellules 1x324 qui contient des matrices en une matrice bidimensionnelle.Convertir une cellule contenant des matrices dans une matrice 2d

Chacun des éléments du tableau de cellules est une matrice de taille 27x94, ils contiennent donc 2538 valeurs différentes. Je veux convertir cette matrice de matrices de cellules en une matrice 324x2538 - où les lignes de la sortie contiennent chaque matrice (en tant que vecteur de ligne) du tableau de cellules.


Pour clarifier ce que mes données ressemble et ce que je suis en train de créer, voir cet exemple:

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 

Ce que je suis en train de faire:

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

S'il vous plaît apprendre vos [types de données] (http://uk.mathworks.com/help/matlab/data-types_data-types.html), le texte original dans cette question, il est très déroutant! Vous ne pouvez pas avoir une matrice qui contient des cellules, puisque les matrices ne peuvent contenir que des données numériques. J'ai édité votre question pour la rendre plus claire pour les futurs visiteurs, puisque vous n'avez pas répondu avec une clarification, mais à l'avenir essayez de ne pas être ambigu en premier lieu, cela encourage de meilleures réponses. – Wolfie

Répondre

3

Le cell2mat la fonction fait exactement cela. L'exemple de doc:

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 

Vous avez votre matrice maintenant, donc il suffit de réusinage à contenir les lignes:

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 

Ou, pour une ligne à partir de votre B:

B = reshape(B,prod(size(A{1})),numel(A)).' 
+0

J'ai essayé cela mais il crée une matrice 27x30456 et ce dont j'ai besoin est de créer une matrice 324x2538. –

0

maintenant J'ai trouvé la solution et je vais l'ajouter ici si quelqu'un a des problèmes similaires à l'avenir:

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

Une façon d'écrire cela serait d'utiliser cellfun pour opérer sur chaque élément de la cellule, puis de concaténer le résultat.

% 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{:}].';