我有一个向量,其中每个值对应一个对角线。我想从此向量创建一个矩阵。我有一个代码:
x = [1:5];
N = numel(x);
diagM = diag(repmat(x(1),N,1),0);
for iD = 2:N
d = repmat(x(iD),N-iD+1,1);
d_pos = diag(d,iD-1);
d_neg = diag(d,-iD+1);
d_join = d_pos+d_neg;
diagM = diagM+d_join;
end
它给了我我想要的东西:
diagM =
1 2 3 4 5
2 1 2 3 4
3 2 1 2 3
4 3 2 1 2
5 4 3 2 1
但是它变得非常缓慢,例如x=[1:10^4]
。
您能否以另一种更快的方式帮助我生成此类序列?
答案 0 :(得分:4)
使用toeplitz
:
x = 1:5;
diagM = toeplitz(x);
或手动进行矢量化处理
x = 1:5;
t = 1:numel(x);
diagM = x(abs(t-t.')+1); % x(abs(bsxfun(@minus, t, t.'))+1) in old Matlab versions