【问题标题】:Calculate the sum of each diagonal of a matrix计算矩阵的每个对角线之和
【发布时间】:2016-10-12 07:18:34
【问题描述】:

我有一个像 A 这样的矩阵,我想计算这个矩阵的每个对角线的总和,并将其显示在像 Y 这样的向量中。

A=[1 2 3; 4 5 6; 7 8 9]

Y=[3 8 15 12 7]

我知道密码

[sum(diag(y,2)),sum(diag(y,1)),sum(diag(y,0)),sum(diag (y,-1)),sum(diag (y,-2))]

但我想把它写成一个函数。

【问题讨论】:

    标签: matlab matrix sum diagonal


    【解决方案1】:

    spdiags 可以做你想做的事:

    dsum = sum(spdiags(A))
    

    你可以用fliplr反转向量并创建一个函数:

    function dsum = diagsum(A)
        dsum = fliplr(sum(spdiags(A)));
    end
    

    结果

    dsum =
    
        3    8   15   12    7
    

    【讨论】:

      【解决方案2】:

      这是一个可能的解决方案:

      [r ,c]=size(A);
      idx=bsxfun(@plus,(r:-1:1)',0:c-1);
      s=flipud(accumarray(idx(:),A(:)));
      

      将此方法与其他答案中提出的spdiags 进行比较,此方法在 Octave 中的性能要好得多。 基准测试:

      A = rand(1000);
      disp('---------bsxfun+accumarray----------')
      tic
          [r ,c]=size(A);
          idx=bsxfun(@plus,(r:-1:1)',0:c-1);
          s=flipud(accumarray(idx(:),A(:)));
      toc
      disp('---------spdiags----------')
      tic
          dsum = fliplr(sum(spdiags(A)));
      toc
      

      结果:

      ---------bsxfun+accumarray----------
      Elapsed time is 0.0114651 seconds.
      ---------spdiags----------
      Elapsed time is 8.62041 seconds.
      

      【讨论】:

      • 从matlab R2016b开始,现在可以去掉bsxfun的使用,直接使用(r:-1:1)' + (0:c-1):)!
      • @TwistedSim 但截至 2018 年,some seasoned MATLAB 用户更喜欢 bsxfun 而不是隐式扩展! :)
      • 当你来自 numpy 背景时,使用广播仍然更有意义;)。我现在意识到我不是第一个这么说的人...... oopsidoopsi
      【解决方案3】:

      类似于the answer from rahnema1,您也可以在应用accumarray 之前使用toeplitz 生成索引:

      [r, c] = size(A);
      index = toeplitz(c:(r+c-1), c:-1:1);
      Y = accumarray(index(:), A(:)).';
      

      【讨论】:

        猜你喜欢
        • 2019-05-16
        • 1970-01-01
        • 2016-02-10
        • 2016-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多