Векторная проекция на матрицу по диагонали - PullRequest
5 голосов
/ 07 апреля 2010

Есть ли простой способ, как получить следующую матрицу:

a = 
  4 5 6 7
  3 4 5 6
  2 3 4 5
  1 2 3 4

которая является проекцией вектора [1 2 3 4 5 6 7] вдоль диагонали?

спасибо

Ответы [ 2 ]

5 голосов
/ 07 апреля 2010

Вы можете сделать это, используя функции HANKEL и FLIPUD :

a = flipud(hankel(1:4,4:7));

Или используя функции TOEPLITZ и FLIPLR :

a = toeplitz(fliplr(1:4),4:7);
a = toeplitz(4:-1:1,4:7);       %# Without fliplr

Вы также можете обобщить эти решения на произвольный вектор, в котором вы выбрали центральную точку, в которой нужно разбить вектор. Например:

>> vec = [6 3 45 1 1 2];  %# A sample vector
>> centerIndex = 3;
>> a = flipud(hankel(vec(1:centerIndex),vec(centerIndex:end)))

a =

    45     1     1     2
     3    45     1     1
     6     3    45     1

Приведенный выше пример размещает первые три элемента вектора, идущие вверх по первому столбцу, и последние четыре элемента вектора, идущие вдоль первой строки.

2 голосов
/ 07 апреля 2010

Рассмотрим это альтернативное решение:

a = bsxfun(@plus, (4:-1:1)', 0:3)

Соответствующее общее решение, которое принимает любой вектор и длину любого столбца:

x = randi(50, [1 10])
num = 5;
idx = bsxfun(@plus, (num:-1:1)', 0:(numel(x)-num));
a = x(idx)

с примером вывода:

x =
    41    46     7    46    32     5    14    28    48    49

a =
    32     5    14    28    48    49
    46    32     5    14    28    48
     7    46    32     5    14    28
    46     7    46    32     5    14
    41    46     7    46    32     5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...