如何在Matlab中沿对角线重复矢量

时间:2014-01-06 20:51:40

标签: matlab matrix vector diagonal

我想在对角A次上重复长度为n的向量m,以获得(n+m-1) x m矩阵B。举个例子,我们说A = [a;b;c;d]m = 4。这应该导致

B = 
[a 0 0 0;
 b a 0 0;
 c b a 0;
 d c b a;
 0 d c b;
 0 0 d c;
 0 0 0 d]

有什么建议可以快速实现这一目标吗?在这种情况下blkdiag(repmat(A,1,m))对我没有帮助,因为它会创建一个(n*m) x m矩阵。

最后,我实际上只对D的第三个矩阵C的矩阵产品B感兴趣:

D=C*B

如果您在不必生成D的情况下看到获取B的其他选项,我将不胜感激。但是上述问题的解决方案也会让我感到非常高兴!顺便提一句,nm会很大。

谢谢!

3 个答案:

答案 0 :(得分:7)

因为@mathematician1975太懒了,无法写出正确的答案。

Matlab有一个函数,名为toeplitz

你会这样称呼:

c=[1;2;3;4;0;0;0];
r=[0, 0, 0, 0];
toeplitz(c,r)

ans =

   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

您可以使用零来按照您希望的方式对矩阵进行整形。

答案 1 :(得分:5)

笨拙但通用的单行

n = 3;      %number of elements in A;
m = 5;      %repetitions
A = (1:n);  

B = full( spdiags( repmat(A(:),1,m)' , 1-(1:n) , n+m-1, m) )

返回:

B =

     1     0     0     0     0
     2     1     0     0     0
     3     2     1     0     0
     0     3     2     1     0
     0     0     3     2     1
     0     0     0     3     2
     0     0     0     0     3

或者是rubenvb's solution

的改进通用版本
B = toeplitz( [A(:);zeros(m-1,1)] , zeros(1,m) )

在两种情况下A都可以是行向量或列向量。

更快的解决方案(因素2x)是spdiags的第一个解决方案!


编辑:甚至更笨拙,但比toeplitz方法快了10倍(取决于n,m):

B = reshape( [repmat([A(:);zeros(m,1)],m-1,1) ; A3(:)] ,[],m ) 

答案 2 :(得分:2)

没有矩阵B的整体解决方案是将C的每一行与A进行卷积。你可以通过for循环来做到这一点:

for k=1:size(C,1)
   D(k,:)=conv(C(k,:),A');
end
D=D(:,length(A)-1:end-length(A)+1);    % elliminate the convolution edges

我认为通过arrayfun

也可以在没有循环的情况下完成
k=1:size(C,1);
D=arrayfun(@(x) conv(C(x,:),A'), k);
D=D(:,length(A)-1:end-length(A)+1);    % elliminate the convolution edges