9
votes

transformer une matrice en vecteur le long de ses diagonales

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 xxx

à xxx

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?


J'ai vraiment besoin d'un peu plus d'aide:

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


0 commentaires

5 Réponses :


3
votes

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


1 commentaires

L'appel à BSXFun est inutile. Vous pouvez simplement faire trier (HH (:)) pour obtenir le vecteur d'index.



1
votes
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

0 commentaires

1
votes

Vous pouvez générer les diagonales de cette manière: xxx pré>

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


0 commentaires


6
votes

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: xxx

à l'aide de SPDIAGS fonction. L'avantage est qu'il fonctionne pour toute taille de matrice arbitraire (pas seulement des matrices carrées). Exemple: xxx


0 commentaires