【问题标题】:Create a matrix by sliding down a given vector by one step for every column通过为每一列向下滑动给定向量一步来创建矩阵
【发布时间】:2015-02-24 15:12:03
【问题描述】:

给定这个向量

a = [1 2 3 4]

我想创建一个这样的矩阵

b = [1 0 0 0;
     2 1 0 0;
     3 2 1 0;
     4 3 2 1;
     0 4 3 2;
     0 0 4 3;
     0 0 0 4]

以不使用循环的矢量化方式。

【问题讨论】:

    标签: matlab matrix vectorization


    【解决方案1】:

    提示:使用conv2(鼠标悬停查看代码):

    a = [1 2 3 4];
    b = conv2(a(:), eye(numel(a)));

    或者,以类似的心情,您可以使用convmtx(来自信号处理工具箱):

    a = [1 2 3 4];
    b = convmtx(a(:), numel(a));

    【讨论】:

    • 我首先需要让我的大脑复杂化才能得到它:p +1
    • @thewaywewalk 哈哈哈。多年接触信号理论,我的大脑已经被宠坏了:-)
    【解决方案2】:

    一种方法:

    a = [1 2 3 4]
    n = numel(a);
    
    %// create circulant matrix from input vector
    b = gallery('circul',[a zeros(1,n-1)]).' %'
    
    %// crop the result
    c = b(:,1:n)
    

    另一种方式:

    b = union( tril(toeplitz(a)), triu(toeplitz(fliplr(a))),'rows','stable')
    

    或略有不同

    b = union( toeplitz(a,a.*0),toeplitz(fliplr(a),a.*0).','rows','stable')
    

    而且可能更快:

    b = [ toeplitz(a,a.*0) ; toeplitz(fliplr(a),a.*0).' ]
    b(numel(a),:) = []
    

    【讨论】:

    • 我一直忘记gallery! +1
    【解决方案3】:

    bsxfun -

    na = numel(a)
    b = zeros(2*na-1,na)
    b(bsxfun(@plus,[1:na]',[0:na-1]*2*na)) = repmat(a(:),1,na)
    

    如果您正在寻找faster pre-allocation,您可以这样做 -

    b(2*na-1,na) = 0;.

    【讨论】:

      【解决方案4】:

      另一个bsxfun -

      a=[1 2 3 4];
      m=numel(a);
      b=[a,zeros(1,m-1)].';
      
      Q=bsxfun(@circshift, b, [0:m-1])
      

      【讨论】:

      • @Divakar - 我的第一个bsxfun 答案!
      猜你喜欢
      • 1970-01-01
      • 2011-12-22
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      相关资源
      最近更新 更多