Есть ли простой способ, как производить следующую матрицу:проекции вектора на матрицу вдоль диагонали
a =
4 5 6 7
3 4 5 6
2 3 4 5
1 2 3 4
, которая является проекцией вектора [1 2 3 4 5 6 7] вдоль диагонали?
благодарит
Есть ли простой способ, как производить следующую матрицу:проекции вектора на матрицу вдоль диагонали
a =
4 5 6 7
3 4 5 6
2 3 4 5
1 2 3 4
, которая является проекцией вектора [1 2 3 4 5 6 7] вдоль диагонали?
благодарит
Вы можете сделать это с помощью функции 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
Приведенный выше пример помещает первые три элемента вектора выполняется до первого столбца и последние четыре элемента вектора, проходящей вдоль первого ряда.
Рассмотрим это альтернативное решение:
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