Je ne suis pas un programmeur, j'ai juste besoin de résoudre quelque chose de numériquement à Matlab. J'ai besoin d'une fonction pour effectuer la transformation suivante pour toute matrice carrée:
de p> à p> IE Ecrivez la matrice dans un vecteur le long de ses diagonales de gauche en haut à droite.
Toutes idées s'il vous plaît? p> J'ai vraiment besoin d'un peu plus d'aide: p> Dites la matrice que nous avons transformée dans le vecteur, a des entrées notées par m (i, j ), où je fais des lignes et des colonnes j. Maintenant, j'ai besoin de pouvoir savoir à partir d'une position dans le vecteur, la position d'origine dans la matrice, c'est-à-dire si sa 3ème entrée dans le vecteur, j'ai besoin d'une fonction qui me donnerait i = 1 j = 2. Des idées s'il vous plaît? Je suis vraiment coincé sur ceci :( merci p> p>
5 Réponses :
Voici une façon de le faire.
%# n is the number of rows (or cols) of the square array n = 3; array = [1 2 3;4 5 6;7 8 9]; %# this is the array we'll reorder %# create list of indices that allow us %# to read the array in the proper order hh = hankel(1:n,n:(2*n-1)); %# creates a matrix with numbered antidiagonals [dummy,sortIdx] = sort(hh(:)); %# sortIdx contains the new order %# reorder the array array(sortIdx) ans = 1 4 2 7 5 3 8 6 9
L'appel à BSXFun est inutile. Vous pouvez simplement faire trier (HH (:)) code> pour obtenir le vecteur d'index.
A=[1,2,3;4,5,6;7,8,9]; d = size(A,1); X=[]; for n = 1:2*size(A,1) - 1 j = min(n,d); i = (n+1)-(j); X = cat(2,X,diag(flipud(A(i:j,i:j)))'); end X X = 1 4 2 7 5 3 8 6 9
Vous pouvez générer les diagonales de cette manière: Je ne sais pas si c'est la manière optimale de concaténer les diagonales: P> d = []
for i = -2:2
d = vertcat(d, diag(flipud(a), i))
end
Vous pouvez convertir votre matrice en un vecteur à l'aide de la fonction Hankel pour générer des indices dans la matrice. Voici une version abrégée de Jonas 'Réponse a>, en utilisant maintenant, vous pouvez utiliser et si vous souhaitez obtenir les indices de ligne et de colonne ( m code> comme matrice d'échantillonnage indiqué ci-dessus:
sellindex code> pour changer votre matrice
M code> à un vecteur
VEC code> comme: p>
rindex code> et
Cindex code>) dans votre matrice d'origine correspondant aux valeurs dans
VEC code>, vous pouvez utiliser la fonction ind2sub : p>
Ceci est assez similaire à un Question précédente sur traversant la matrice dans un ordre de zigzag. Avec une légère modification, nous obtenons: à l'aide de SPDIAGS fonction. L'avantage est qu'il fonctionne pour toute taille de matrice arbitraire (pas seulement des matrices carrées). Exemple: p>