J'ai une matrice 3D (n-by-m-by-t
) dans MATLAB représentant n-by-m
mesures dans une grille sur une période de temps. Je voudrais avoir une matrice 2d, où l'information spatiale a disparu et seulement n*m
les mesures dans le temps t
sont laissées (c'est-à-dire: n*m-by-t
)
Comment puis-je faire ceci?
Vous avez besoin de la commande reshape
:
Disons que votre matrice initiale est (juste pour moi d'obtenir des données):
a=Rand(4,6,8);
Ensuite, si les deux dernières coordonnées sont spatiales (le temps est 4, m est 6, n est 8), vous utilisez:
a=reshape(a,[4 48]);
et vous vous retrouvez avec un tableau 4x48.
Si les deux premiers sont spatiaux et le dernier est le temps (m est 4, n est 6, le temps est 8), vous utilisez:
a=reshape(a,[24 8]);
et vous vous retrouvez avec un tableau 24x8.
Il s'agit d'une opération rapide, O(1) (elle ajuste simplement l'en-tête de la forme des données). Il existe d'autres façons de le faire, par exemple a=a(:,:)
pour condenser les deux dernières dimensions, mais le remodelage est plus rapide.
Remodeler est bien sûr la solution standard pour remodeler un tableau. (Comment pourraient-ils l'appeler autrement?) Il y a encore quelques astuces à découvrir.
Tout d'abord, la manière la plus simple de transformer un tableau de taille [n, m, p] en un tableau de taille [n * m, p]?
B = reshape(A,n*m,p);
Mais c'est mieux:
B = reshape(A,[],p);
Si vous laissez un des arguments pour remodeler vide, alors remodeler calcule la taille pour vous! Attention, si vous essayez ceci et que la taille de A n'est pas conforme, vous obtiendrez une erreur. Donc:
reshape(magic(3),[],2)
??? Error using ==> reshape
Product of known dimensions, 2, not divisible into total number of elements, 9.
Logiquement, nous ne pouvons pas créer un tableau de deux colonnes à partir de quelque chose qui contient 9 éléments. J'ai mis une fonction appelée wreshape sur l'échange central MATLAB qui remplirait au besoin pour faire cette opération sans erreur générée.
Bien sûr, vous pouvez toujours utiliser des astuces comme
B = A(:);
pour créer un vecteur directement à partir d'une matrice. C'est l'équivalent du formulaire
B=reshape(A,[],1);
Une meilleure solution à ce problème consiste à utiliser nshape.m disponible dans la boîte à outils N-Way de Rasmus Bro. Cela vous permettra de remodeler le long d'un mode donné, ce qui est un peu plus délicat avec la commande remodeler.
La boîte à outils est disponible sur le lien suivant:
https://www.mathworks.com/matlabcentral/fileexchange/1088-the-n-way-toolbox
Il existe également d'autres excellents outils pour aider à la manipulation des tableaux.