2010-08-09 12 views
9

im no soy un programador, solo tengo que resolver algo numéricamente en matlab. necesito una función para realizar la siguiente transformación para cualquier matriz cuadrada:transformando una matriz en un vector a lo largo de sus diagonales

de

row 1: 1 2 3 
row 2: 4 5 6 
row 3: 7 8 9 

a

1 4 2 7 5 3 8 6 9 

es decir, escribir la matriz en un vector a lo largo de sus diagonales de izquierda a arriba a la derecha . alguna idea por favor?


Realmente necesito un poco más de ayuda sin embargo:

decir la matriz que hemos transformado en el vector, tiene entradas indicadas por M (i, j), donde i son filas y columnas j. ahora necesito poder averiguar desde una posición en el vector, la posición original en la matriz, es decir, si es la 3ª entrada en el vector, necesito una función que me dé i = 1 j = 2. alguna idea, por favor? soy muy pegado en esta :(gracias

Respuesta

3

Ésta es una forma de hacer esto

%# 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 
+0

La llamada a BSXFUN no es necesaria.Puedes hacer 'sort (hh (:))' para obtener el vector de índice. – gnovice

+0

Gracias, @gnovice – Jonas

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

Puede generar las diagonales de esta manera:.

for i = -2:2 
    diag(flipud(a), i) 
end 

No sé si esta es la forma óptima de concatenar las diagonales:

d = [] 
for i = -2:2 
    d = vertcat(d, diag(flipud(a), i)) 
end 

(Lo probé en octava, no en matlab)

2

Puede convertir su matriz en un vector utilizando la función HANKEL para generar índices en la matriz. Aquí es una versión abreviada de Jonas' answer, utilizando M como su matriz de la muestra dado anteriormente:

N = size(M,1); 
A = hankel(1:N,N:(2*N-1)); 
[junk,sortIndex] = sort(A(:)); 

Ahora, puede utilizar sortIndex cambiar su matriz M a un vector vec así:

vec = M(sortIndex); 

Y si desea obtener los índices de fila y columna (rIndex y cIndex) en su matriz original que corresponden a los valores en vec, puede usar la función IND2SUB:

[rIndex,cIndex] = ind2sub(N,sortIndex); 
6

Esto es muy similar a un previous question en atravesar la matriz en un orden en zigzag. Con una ligera modificación, obtenemos:

A = rand(3);      %# input matrix 

ind = reshape(1:numel(A), size(A)); %# indices of elements 
ind = spdiags(fliplr(ind));   %# get the anti-diagonals 
ind = ind(end:-1:1);    %# reverse order 
ind = ind(ind~=0);     %# keep non-zero indices 
B = A(ind);       %# get elements in desired order 

usando la función SPDIAGS. La ventaja de esto es que funciona para cualquier tamaño de matriz arbitraria (no solo matrices cuadradas). Ejemplo:

A = 
     0.75127  0.69908  0.54722  0.25751 
     0.2551  0.8909  0.13862  0.84072 
     0.50596  0.95929  0.14929  0.25428 
B = 
    Columns 1 through 6 
     0.75127  0.2551  0.69908  0.50596  0.8909  0.54722 
    Columns 7 through 12 
     0.95929  0.13862  0.25751  0.14929  0.84072  0.25428 
Cuestiones relacionadas