2011-04-08 4 views
1

J'ai une matrice M-by-M-by-N, qui est une concaténation de N matrices M-by-M. Je veux réduire cette matrice à une matrice M-by-N en prenant les diagonales de chaque sous-matrice M-by-M et en les concaténant ensemble. Comment puis-je le faire d'une manière simple et vectorisée?Comment indexer les diagonales d'une matrice 3D dans MATLAB?

+0

Hmmm, je pensais avoir déjà répondu à quelque chose comme ça, mais il m'a fallu du temps pour le trouver: [changer les diagonales à 1 dans une matrice 4 dimensions dans matlab] (http://stackoverflow.com/questions/ 5319178/changeant-diagonales-en-1-en-4-matrice-matricielle-en-matlab). Bien qu'il y ait de légères différences (assignation versus indexation, 3-D versus 4-D), les réponses sont assez générales pour que les questions puissent probablement être considérées comme des doublons. Peut-être un raffinement des titres et des étiquettes est-il dans le but de les rendre plus faciles à trouver (je me trouve dire beaucoup ces derniers temps). – gnovice

+0

Beaucoup de questions sont décrites en termes de besoins du demandeur (par exemple, comment puis-je calculer la concentration à partir du bla bla), mais sont essentiellement des questions de manipulation matricielle. Je proposerais de les nettoyer plus tard, après que le demandeur soit satisfait, pour le rendre plus général (c.-à-d., Supprimer les besoins spécifiques et le couper aux os nus). Cela aiderait en fait les personnes à chercher des réponses à les trouver plus facilement et, espérons-le, à réduire les dupes, car dans la plupart des cas, la confusion est due à la façon dont la question est formulée. – abcd

+0

@R. M .: J'ai déjà fait quelques modifications afin que les titres et les balises soient plus clairs et nous espérons qu'ils apparaîtront mieux dans les recherches pour ce genre de question de manipulation de matrice. – gnovice

Répondre

3

Vous pouvez le faire en obtenant les indices linéaires des diagonales et l'utiliser pour former une nouvelle matrice

[M,~,N]=size(A);%# A is your matrix 
indx=cumsum([1:(M+1):M^2; M^2.*ones(N-1,M)]);%#diagonal indices 

B=A(indx');%'# transpose to get MxN 

Dans ce qui précède, je l'ai utilisé ~ d'ignorer que la sortie de la fonction. Cependant, cela ne fonctionne que si vous utilisez MATLAB R2009b et plus. Si votre version est plus ancienne, utilisez plutôt une variable fictive.

Questions connexes