matlab:对角线填充矩阵
matlab: filling matrix diagonalwise
我有一个具有特定值的 (2n-1)×1 向量,我想获得一个 n-n 矩阵,其对角线使用相同的值填充。
例如。如果我有
a = [1; 2; 3; 4; 5];
我要获取
A = [[3 4 5];[2 3 4];[1 2 3]]
= 3 4 5
2 3 4
1 2 3
我的矩阵尺寸要大得多,所以我希望它尽可能高效。我已经找到了以下解决方案:
n = 3;
A = toeplitz(a);
A = A(1:n,end-n+1:end)
和
A = a(n)*eye(n);
for j=1:n-1
A(1+j:n+1:end-j*n) = a(n-j);
A(j*n+1:n+1:end) = a(n+j);
end
我想知道是否有更有效的方法来获得这个结果,请记住我正在处理巨大的矩阵并且确实需要速度。
ix=bsxfun(@plus,[1:n],[n-1:-1:0]'); %generate indices
A=a(ix);
或
A=hankel(a) %might be faster than toeplitz because half the matrix is zero
A(n:-1:1,1:n)
这是 hankel
内部所做的(至少在 ML R2013a 中),适用于此问题:
c=[1:n];
r=[n-1:-1:0]';
idx=c(ones(n,1),:)+r(:,ones(n,1));
A=a(ix);
我想 bsxfun 解决方案和 thewaywewalk
应该是最快的(基本相同)
选择:
n = (numel(a)+1)/2;
A = a(bsxfun(@minus, n+1:n+n, (1:n).'));
我有一个具有特定值的 (2n-1)×1 向量,我想获得一个 n-n 矩阵,其对角线使用相同的值填充。
例如。如果我有
a = [1; 2; 3; 4; 5];
我要获取
A = [[3 4 5];[2 3 4];[1 2 3]]
= 3 4 5
2 3 4
1 2 3
我的矩阵尺寸要大得多,所以我希望它尽可能高效。我已经找到了以下解决方案:
n = 3;
A = toeplitz(a);
A = A(1:n,end-n+1:end)
和
A = a(n)*eye(n);
for j=1:n-1
A(1+j:n+1:end-j*n) = a(n-j);
A(j*n+1:n+1:end) = a(n+j);
end
我想知道是否有更有效的方法来获得这个结果,请记住我正在处理巨大的矩阵并且确实需要速度。
ix=bsxfun(@plus,[1:n],[n-1:-1:0]'); %generate indices
A=a(ix);
或
A=hankel(a) %might be faster than toeplitz because half the matrix is zero
A(n:-1:1,1:n)
这是 hankel
内部所做的(至少在 ML R2013a 中),适用于此问题:
c=[1:n];
r=[n-1:-1:0]';
idx=c(ones(n,1),:)+r(:,ones(n,1));
A=a(ix);
我想 bsxfun 解决方案和 thewaywewalk
应该是最快的(基本相同)
选择:
n = (numel(a)+1)/2;
A = a(bsxfun(@minus, n+1:n+n, (1:n).'));