我想在对角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
的其他选项,我将不胜感激。但是上述问题的解决方案也会让我感到非常高兴!顺便提一句,n
和m
会很大。
谢谢!
答案 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
的改进通用版本
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