计算矩阵的累积和
Copy the first row of source matrix A into matrix CS
for every row except for the first one:
for every column:
CS[r][c] = CS[r-1][c] + A[r][c]
for every row:
for every column except for the first one:
CS[r][c] += CS[r][c-1]
现在您可以在 y,x 处找到右下角的任何子矩阵的总和
(省略索引
Sum = CS[y][x] + CS[y - n][x - n] - CS[y-n][x] - CS[y][x-n]
供参考:OpenCV 中的integral image
import random, pprint
a = [[random.randint(0,1) for _ in range(9)] for _ in range(9)]
pprint.PrettyPrinter(indent = 2).pprint(a)
cs = [[0]*10 for _ in range(10)]
for i in range(9):
cs[0][i] = a[0][i]
for r in range(1, 9):
for c in range(9):
cs[r][c] = cs[r-1][c] + a[r][c]
for r in range(9):
for c in range(1, 9):
cs[r][c] += cs[r][c-1]
pprint.PrettyPrinter(indent = 2).pprint(cs)
maxs = -1
for r in range(2, 9):
for c in range(2, 9):
s = cs[r][c] + cs[r - 3][c - 3] - cs[r -3][c] - cs[r][c-3]
if s > maxs:
maxs = s
best = (r, c)
print(maxs, best)
[ [1, 1, 0, 0, 0, 1, 1, 0, 0],
[1, 1, 0, 1, 0, 0, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1, 0],
[0, 0, 1, 0, 1, 1, 0, 0, 1],
[0, 0, 0, 1, 1, 0, 0, 1, 1],
[0, 1, 1, 0, 0, 0, 0, 0, 1],
[1, 0, 1, 0, 0, 1, 1, 0, 1],
[1, 1, 0, 1, 0, 1, 0, 0, 0],
[1, 0, 0, 1, 0, 0, 1, 1, 1]]
[ [1, 2, 2, 2, 2, 3, 4, 4, 4, 0],
[2, 4, 4, 5, 5, 6, 7, 8, 8, 0],
[2, 5, 5, 7, 7, 9, 10, 12, 12, 0],
[2, 5, 6, 8, 9, 12, 13, 15, 16, 0],
[2, 5, 6, 9, 11, 14, 15, 18, 20, 0],
[2, 6, 8, 11, 13, 16, 17, 20, 23, 0],
[3, 7, 10, 13, 15, 19, 21, 24, 28, 0],
[4, 9, 12, 16, 18, 23, 25, 28, 32, 0],
[5, 10, 13, 18, 20, 25, 28, 32, 37, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
6 (4, 5)