Как сделать матрицу Теплица эффективно Matlab - PullRequest
0 голосов
/ 20 марта 2019

Предположим, у меня есть вектор x и 2 константы, инициализированные следующим образом:

x = [ones(1,21) zeros(1,79)]; %step of 100 components
p = 2; q = 0;

Теперь я хочу построить эту матрицу:

enter image description here

Но в этом случае, например, x (q-1) = x (-1) не существует, поэтому я хочу, чтобы оно было 0, и мне было интересно, есть ли способ сделатьэто с минимальными строками кода.Обратите внимание, что матрица может быть записана с помощью функции toeplitz(), но я не знаю, как заменить несуществующую позицию моего вектора x нулями.

Я надеюсь, что кто-то может мне помочь.Спасибо за ваши ответы.

1 Ответ

2 голосов
/ 20 марта 2019

Вы должны быть осторожны при индексации с нуля или на основе единицы.

В своем вопросе вы утверждаете, что отрицательные индексы недопустимы - в MATLAB индекс 0 также недопустим. В приведенном ниже коде предполагается, что x(q) начинается с нуля, как описано, но я выполняю преобразование +1. Помните об этом, если q+p-1 близко к numel(x).

x = [ones(1,21) zeros(1,79)]; %step of 100 components
p = 2; q = 0;

% Set up indexing matrix using implicit expansion (R2016b or newer)
m = ( q:-1:q-p+1 ) + ( 0:1:q+p-1 ).';
% Convert from 0-based to 1-based for MATLAB
m = m + 1;
% Set up output matrix, defaulting to zero
M = zeros( size( m ) );
% Put elements where 'm' is valid from 'x' into output 'M'
M( m > 0 ) = x( m( m > 0 ) );

На выходе получается матрица (q+p) * p.

...