如何有效地做一个toeplitz矩阵matlab
How to do a toeplitz matrix efficiently matlab
假设我有一个向量 x
和 2 个初始化如下的常量:
x = [ones(1,21) zeros(1,79)]; %step of 100 components
p = 2; q = 0;
现在,我要构建这个矩阵:
但在这种情况下,例如 x(q-1) = x(-1) 不存在,所以我希望它为 0,我想知道是否有办法用最少的代码行。请注意,矩阵可以用函数 toeplitz()
编写,但我不知道如何用零替换向量 x
不存在的位置。
希望有人能帮助我。谢谢你的回答。
您需要注意从零开始或从一开始的索引。
在您的问题中,您声明负索引无效 - 在 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
矩阵。
假设我有一个向量 x
和 2 个初始化如下的常量:
x = [ones(1,21) zeros(1,79)]; %step of 100 components
p = 2; q = 0;
现在,我要构建这个矩阵:
但在这种情况下,例如 x(q-1) = x(-1) 不存在,所以我希望它为 0,我想知道是否有办法用最少的代码行。请注意,矩阵可以用函数 toeplitz()
编写,但我不知道如何用零替换向量 x
不存在的位置。
希望有人能帮助我。谢谢你的回答。
您需要注意从零开始或从一开始的索引。
在您的问题中,您声明负索引无效 - 在 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
矩阵。