web-dev-qa-db-fra.com

Remodeler la matrice 3D en matrice 2D

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?

23
Peter Smit

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.

28
Ramashalanka

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);
11
user85109

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.

1
user3014616