【问题标题】:how to create the matrix with the shifted version of the signal samples in Matlab?如何在 Matlab 中使用信号样本的移位版本创建矩阵?
【发布时间】:2019-04-24 22:03:07
【问题描述】:

我有大小为 25001x1 的向量,它代表我的一个信号样本,我想创建矩阵,使矩阵的第一列是我的向量或信号,每列的其余部分是原始信号的移位版本或向量。我通过以下方式完成(10x1 的向量被考虑用于理解目的)通过添加零。

 y=[1 2 3 4 5 6 7 8  9 10 ]';

 A=zeros(10,10);

 for i=1:length(y)
 A(:,i)=y;
 y=[1 2 3 4 5 6 7 8  9 10 ]';
 y=[zeros(1,(i))';y(1:end-(i))];

 end  

导致跟随

>> A

 A =

 1     0     0     0     0     0     0     0     0     0
 2     1     0     0     0     0     0     0     0     0
 3     2     1     0     0     0     0     0     0     0
 4     3     2     1     0     0     0     0     0     0
 5     4     3     2     1     0     0     0     0     0
 6     5     4     3     2     1     0     0     0     0
 7     6     5     4     3     2     1     0     0     0
 8     7     6     5     4     3     2     1     0     0
 9     8     7     6     5     4     3     2     1     0
10     9     8     7     6     5     4     3     2     1

现在,当我想要移动多个元素或想要添加多个零时,我做了以下操作

y=[1 2 3 4 5 6 7 8  9 10 11 ]';

A=zeros(11,11);

for i=1:length(y)
A(:,i)=y;
y=[1 2 3 4 5 6 7 8  9 10 11  ]';
y=[zeros(1,(i*2))';y(1:end-(i*2))];
if (i>=(length(y)/2))
    break;
end 


end 

结果如下

>> A

A =

 1     0     0     0     0     0     0     0     0     0     0
 2     0     0     0     0     0     0     0     0     0     0
 3     1     0     0     0     0     0     0     0     0     0
 4     2     0     0     0     0     0     0     0     0     0
 5     3     1     0     0     0     0     0     0     0     0
 6     4     2     0     0     0     0     0     0     0     0
 7     5     3     1     0     0     0     0     0     0     0
 8     6     4     2     0     0     0     0     0     0     0
 9     7     5     3     1     0     0     0     0     0     0
10     8     6     4     2     0     0     0     0     0     0
11     9     7     5     3     1     0     0     0     0     0

是否有任何通用方法可以在不使用 for 循环的情况下做同样的事情?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    您问题的第一部分已回答in this other Q&A。那里最快的方法(不是公认的答案)如下:

    N = numel(A);
    val = repmat([A(:);0],1,N).*bsxfun(@le,[1:N+1]',[N:-1:1]);
    out = reshape(val(1:N*N),N,N);
    

    对于 MATLAB R2016b 及更高版本,我们可以对其进行现代化改造:

    N = numel(A);
    val = repmat([A(:);0],1,N) .* ((1:N+1).' <= (N:-1:1));
    out = reshape(val(1:N*N),N,N);
    

    (我只是将bsxfun(@le,x,y) 替换为x&lt;=y,因为几年前在这些情况下不再需要使用bsxfun。我还删除了多余的串联运算符[],并替换了'加上.',更适合这种用法。)

    对于您问题的第二部分,我们需要以非平凡的方式概括上面的代码。以下代码是其结果:

    N = numel(A);
    step = 2;          % Set this to however many zeros you want to add each column
    indx = N:-step:1;
    M = numel(indx);
    val = (1:N+step).' <= indx; % use bsxfun(@le, (1:N+step).',indx) instead for older MATLAB
    val = repmat([A(:);zeros(step,1)],1,M).* val;
    out = reshape(val(1:N*M),N,[]);
    

    我已将N:-1:1 替换为N:-step:1,这是主要更改。我还需要将step 零添加到A,而不是仅添加一个(这是[A(:);zeros(step,1)],之前是[A(:);0])。我调整了各处的大小以适应较小的输出数组。

    请注意,这不会产生任何空(全零)列。要添加这些,最简单的方法是:

    out2 = zeros(N,N);
    out2(:,1:size(out,2)) = out;
    

    【讨论】:

    • (1:N+1).' &lt;= (N:-1:1) 显示错误 Error using
    • @Cris Luengo 作为我的第一条评论表明您所做的更改而不是使用 bsxfun(@le,x,y) 在这两种代码中都不起作用。第二个代码而不是逻辑运算符,我使用bsxfun(@le,x,y) 和我在代码val = repmat([A(:);zeros(step,1)],1,M).* (val'); 中进行的另一项细微更改,然后它工作正常。感谢您的帮助。
    • @Anil:如果您有旧版本的 MATLAB,那么您需要继续使用bsxfun。我以为你是最新的版本,抱歉。你做的第二个改变我不明白。如果您不知何故需要它,这意味着您以错误的方向生成了val 。尝试修复前一行,转置矩阵很昂贵。
    • 是的,你是对的,你的代码在 Matlab2017 上非常好。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2014-06-04
    相关资源
    最近更新 更多