【问题标题】:matlab: filling matrix diagonalwise [duplicate]matlab:对角线填充矩阵[重复]
【发布时间】:2015-05-15 17:14:54
【问题描述】:

我有一个具有某些值的 (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

我想知道是否有更有效的方法来获得这个结果,记住我正在处理巨大的矩阵并且真的需要速度。

【问题讨论】:

  • A = toeplitz( a(n:-1:1),a(n:end) ); 的表现如何?

标签: matlab matrix variable-assignment vectorization diagonal


【解决方案1】:

去:

n = (numel(a)+1)/2;
A = a(bsxfun(@minus, n+1:n+n, (1:n).'));

【讨论】:

    【解决方案2】:
     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 应该是最快的(基本一样)

    【讨论】:

    • toeplitzhankel 内部都使用bsxfun,后者直接是最快的。只是不太方便;)+1
    • 在我的版本 (2013a) hankel 中没有使用 bsxfun,而是使用了一些非常奇怪的代码来替换它。
    • 我会赌bsxfun
    • @Daniel 在 2014a 中已经使用 bsxfun。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2017-02-19
    • 1970-01-01
    相关资源
    最近更新 更多