假设我有一个方阵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
我希望对我想要实现的目标的解释是可以理解的。由于我的矩阵远大于本例中的矩阵,因此计算也应该有效...但到目前为止,我甚至无法弄清楚如何“低效率”地计算它。
答案 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))));
但这是最快的方法吗?
我认为逻辑索引可能会让你更快