2

假设我有一个方阵 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

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

4

2 回答 2

2

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

Mp = fliplr(triu(fliplr(cumsum(M)),1)) ...
     +flipud(triu(cumsum(flipud(M)),1)) ...
     +flipud(diag(diag(flipud(M))));
于 2013-08-01T15:22:57.090 回答
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))));

但这是最快的方法吗?

我认为逻辑索引可能会让你更快地到达那里

于 2013-08-01T15:22:15.803 回答