2010-04-07 3 views

ответ

5

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

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

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 
Смежные вопросы