我正在尝试构造给定图像矩阵的summed area table or integral image。对于那些不知道它是什么的人,来自维基百科:


求和面积表(也称为积分图像)是一种数据结构和算法,用于快速有效地生成网格的矩形子集中的值之和


换句话说,它用于在恒定时间内对图像/矩阵中任何矩形区域的值求和。

我正在尝试在R中实现此功能。但是,我的代码似乎需要花费很长时间才能运行。

这是this link中的伪代码。 in是输入矩阵或图像,intImg是返回的内容

因为我= 0去做
总和←0

对于j = 0到h
sum←sum + in [i,j]

如果我= 0
intImg [i,j]←总和
其他
intImg [i,j]←intImg [i-1,j] +和
万一
结束于
结束于


这是我的实现

w = ncol(im)
h = nrow(im)
积分= c(NA)
长度(intImg)= w * h

for(i在1:w中){#x
总和= 0;
for(j in 1:h){#y
ind =((j-1)* w)+(i-1)+ 1#索引
sum = sum + im [ind]
if(i == 1){
intImg [ind] =总和
}其他{
intImg [ind] = intImg [ind-1] +和
}
}
}
intImg =矩阵(intImg,h,w,byrow = T)


输入和输出矩阵的示例:



但是,在480x640矩阵上,这大约需要4秒钟。在本文中,他们将这些尺寸描述为以毫秒为单位。

我在循环或索引中做的效率低下吗?

我考虑过用C ++编写并将其包装在R中,但是我对C ++不太熟悉。

谢谢

最佳答案

您可以尝试使用apply(如果您预先分配了内存,它不会比for循环快):

areaTable <- function(x) {
  return(apply(apply(x, 1, cumsum), 1, cumsum))
}

areaTable(m)
#      [,1] [,2] [,3] [,4]
# [1,]    4    5    7    9
# [2,]    4    9   12   17
# [3,]    7   13   16   25
# [4,]    9   16   22   33

08-19 22:37