2010-11-29 9 views
4

Étant donné un vecteur des contre-diagonales d'une matrice dans matlab, existe-t-il un moyen facile de reconstruire la matrice?Reconstruire la matrice à partir de diagonales dans matlab

Par exemple, étant donné

x = [1 2 3 4 5 6 7 8 9] 

est-il un moyen facile de le reconstituer à ce qui suit?

1 2 4 
3 5 7 
6 8 9 

Ceci est rendu légèrement plus facile par le fait que les dimensions du bloc original sont connues. Reconstruire une rotation ou une transposition de la matrice d'origine est bien, car la rotation et la transposition sont faciles à annuler. Plus vite c'est mieux, ce calcul doit être fait sur beaucoup de x s.

Merci!

+0

x monte à 9, non? – Jonas

+0

Il manque un 9. ce qui rend la question bizarre. – carlosdc

Répondre

4

Vous pouvez créer la matrice et de l'utiliser pour le tri (ne fonctionne que si la sortie est une matrice carrée!) Hankel correspondant:

x = [1 2 3 4 5 6 7 8 9]; 

%# find size of output (works only with square arrays) 
n=sqrt(length(x)); 

%# create Hankel matrix 
hh = hankel(1:n,n:(2*n-1)); 

%# sort to get order of elements (conveniently, sort doesn't disturb ties) 
[~,sortIdx]=sort(hh(:)); 

%# reshape and transpose 
out = reshape(x(sortIdx),n,n)'; %'# SO formatting 

out = 
    1  2  4 
    3  5  7 
    6  8  9