преобразование матрицы в вектор вдоль ее диагоналей - PullRequest
9 голосов
/ 09 августа 2010

Я не программист, мне просто нужно что-то решать численно в Matlab.мне нужна функция, чтобы сделать следующее преобразование для любой квадратной матрицы:

от

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

до

1 4 2 7 5 3 8 6 9

т.е. записать матрицу в векторе вдоль ее диагоналейслева направоЛюбые идеи, пожалуйста?


мне действительно нужно немного больше помощи, хотя:

скажем, матрица, которую мы преобразовали в вектор, имеет записи, обозначенные через M (i, j),где я строки и J столбцы.теперь мне нужно иметь возможность узнать из позиции в векторе исходную позицию в матрице, т.е. сказать, если это 3-я запись в векторе, мне нужна функция, которая дала бы мне i = 1 j = 2.какие-нибудь идеи, пожалуйста?я действительно застрял на этом :( спасибо

Ответы [ 5 ]

6 голосов
/ 10 августа 2010

Это очень похоже на предыдущий вопрос о обходе матрицы в зигзагообразном порядке.С небольшими изменениями мы получаем:

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

с использованием функции SPDIAGS .Преимущество этого состоит в том, что это работает для любого произвольного размера матрицы (не только квадратные матрицы).Пример:

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
3 голосов
/ 09 августа 2010

Вот один из способов сделать это.

%# 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
2 голосов
/ 09 августа 2010

Вы можете преобразовать вашу матрицу в вектор, используя функцию HANKEL для генерации индексов в матрице. Вот сокращенная версия ответа Джонаса с использованием M в качестве матрицы примеров, приведенной выше:

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

Теперь вы можете использовать sortIndex, чтобы изменить матрицу M на вектор vec, например, так:

vec = M(sortIndex);

И если вы хотите получить индексы строк и столбцов (rIndex и cIndex) в исходную матрицу, соответствующие значениям в vec, вы можете использовать функцию IND2SUB :

[rIndex,cIndex] = ind2sub(N,sortIndex);
1 голос
/ 09 августа 2010

Вы можете создать диагонали следующим образом:

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

Я не знаю, является ли это оптимальным способом объединения диагоналей:

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

(я проверял это в октаве, а не в matlab)

1 голос
/ 09 августа 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...