我正在尝试构建一个积分图或者叫做面积和表,给定一个图像矩阵。对于那些不知道它是什么的人,可以参考维基百科的解释:
“积分图(也称为面积和表)是一种数据结构和算法,用于快速有效地生成网格子集中值的总和。”
换句话说,它用于在图像/矩阵中常数时间内求任何矩形区域的值之和。
我正在尝试在R中实现这个算法。然而,我的代码似乎运行时间过长。
以下是此链接中的伪代码。其中,
我在循环或索引方面做得不够高效吗?
我考虑用C++编写它并将其包装在R中,但我对C ++不是很熟悉。
谢谢
“积分图(也称为面积和表)是一种数据结构和算法,用于快速有效地生成网格子集中值的总和。”
换句话说,它用于在图像/矩阵中常数时间内求任何矩形区域的值之和。
我正在尝试在R中实现这个算法。然而,我的代码似乎运行时间过长。
以下是此链接中的伪代码。其中,
in
是输入的矩阵或图像,intImg
是返回的结果。
对于i从0到w的循环,执行以下操作: sum←0
对于j从0到h的循环,执行以下操作: sum ← sum + in[i, j]
如果 i = 0,则 intImg[i, j] ← sum 否则, intImg[i, j] ← intImg[i − 1, j] + sum 结束如果 结束循环 结束循环
这是我的实现:
w = ncol(im) h = nrow(im) intImg = c(NA) length(intImg) = w*h
for(i in 1:w){ #x sum = 0; for(j in 1:h){ #y ind = ((j-1)*w)+ (i-1) + 1 #index sum = sum + im[ind] if(i == 1){ intImg[ind] = sum }else{ intImg[ind] = intImg[ind-1]+sum } } } intImg = matrix(intImg, h, w, byrow=T)
输入矩阵和输出矩阵的示例:
480x640
矩阵上,这需要约4秒钟。在论文中,他们描述这些维度的运行时间为毫秒级别。我在循环或索引方面做得不够高效吗?
我考虑用C++编写它并将其包装在R中,但我对C ++不是很熟悉。
谢谢
im
的链接可以使这个过程可重现。没有示例很难理解你在做什么,但你可能可以使用colSums()
和rowSums()
或其他一些矢量化函数。 - Chaseim
只是一个矩阵。我在问题中添加了输入和输出的示例。 - Omar Wagihm = matrix(c(4,1,2,2,0,4,1,3,3,1,0,4,2,1,3,2), 4,4,byrow=T)
- Omar Wagih