Векторная проекция на матрице вдоль диагонали

Есть ли простой способ, как произвести после матрицы:

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

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

спасибо

5
задан gnovice 7 April 2010 в 18:30
поделиться

2 ответа

Вы можете сделать это с помощью функций 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

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

5
ответ дан 14 December 2019 в 08:46
поделиться

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

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
2
ответ дан 14 December 2019 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: