计算方阵的部分累积和

时间:2013-08-01 14:54:50

标签: matlab matrix

假设我有一个方阵M:

M = [0 0 0 0 0 1 9; 0 0 0 0 0 4 4; 0 0 1 1 6 1 1; 0 1 2 9 2 1 0; 2 1 8 3 2 0 0; 0 8 1 1 0     0 0; 14 2 0 1 0 0 0]


      0 0 0 0 0 1 9
      0 0 0 0 0 4 4
      0 0 1 1 6 1 1
 M =  0 1 2 9 2 1 0
      2 1 8 3 2 0 0
      0 8 1 1 0 0 0
     14 2 0 1 0 0 0

现在我想计算两个不同的累积和:一个从每列的顶部到列的元素,一个是矩阵的对角元素,另一个是从列的底部开始的到相同的对角元素。

因此,结果矩阵M'应如下:

       0 0 0 0 0 1 9
       0 0 0 0 0 4 5
       0 0 1 1 6 2 1
 M' =  0 1 3 9 4 1 0
       2 2 8 5 2 0 0
       2 8 1 2 0 0 0
      14 2 0 1 0 0 0

我希望对我想要实现的目标的解释是可以理解的。由于我的矩阵远大于本例中的矩阵,因此计算也应该有效...但到目前为止,我甚至无法弄清楚如何“低效率”地计算它。

2 个答案:

答案 0 :(得分:2)

在一行中使用一些翻转和上三角函数triu

Mp = fliplr(triu(fliplr(cumsum(M)),1)) ...
     +flipud(triu(cumsum(flipud(M)),1)) ...
     +flipud(diag(diag(flipud(M))));

答案 1 :(得分:1)

以下将完成这项工作:

Mnew = fliplr(triu(cumsum(triu(fliplr(M)),1))) + flipud(triu(cumsum(triu(flipud(M)),1)));
Mnew = Mnew - fliplr(diag(diag(fliplr(Mnew)))) + fliplr(diag(diag(fliplr(M))));

但这是最快的方法吗?

我认为逻辑索引可能会让你更快