【发布时间】: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
给定这个向量
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
一种方法:
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
与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;.
【讨论】:
另一个bsxfun -
a=[1 2 3 4];
m=numel(a);
b=[a,zeros(1,m-1)].';
Q=bsxfun(@circshift, b, [0:m-1])
【讨论】:
bsxfun 答案!