C 多维数组边/边界条件

C 多维数组边/边界条件,c,multidimensional-array,conditional,convolution,C,Multidimensional Array,Conditional,Convolution,我迭代一个三维数组(每个像素有3个值的图像),对每个像素应用3x3过滤器,如下所示: //For each value on the image for (i=0;i<3*width*height;i++){ //For each filter value for (j=0;j<9;j++){ if (notOutsideEdgesCondition){ *(**(outArray)+i)+= *(**(pixelArr

我迭代一个三维数组(每个像素有3个值的图像),对每个像素应用3x3过滤器,如下所示:

//For each value on the image    
for (i=0;i<3*width*height;i++){
    //For each filter value
    for (j=0;j<9;j++){
        if (notOutsideEdgesCondition){
            *(**(outArray)+i)+= *(**(pixelArray)+i-1+(j%3)) * (*(filter+j));
        } 
    }
}
//对于图像上的每个值

对于(i=0;i一个很好的技巧是在数组的顶部添加一行,在末尾添加另一行(对列执行相同的操作)

这些额外的行/列将不包含任何信息,但它们将简化计算(无边界情况)


只是一个想法:)

是的,有一个更好的方法。编写一个快速循环来处理保证没有边界问题的情况。这将包括从第二列到下一列和从第二行到下一行的区域。然后,您可以编写四个例程来处理每一条边(第0行、第0列、第N行和第N列),并且可以手工编写最后四个点的代码


这就是说,还有很多更快的方法来进行寻址计算。

我会试试,这需要更多的编码,但希望我能让它更简单。另外,你能给我指出正确的方向,让寻址计算更快吗?我在谷歌上快速搜索了一下,试图为你找到一个展开数组寻址计算的教程,但没有找到。简言之,尽可能避免每像素寻址计算。使用在工作时从一个像素到另一个像素递增的指针,并删除所有模运算和乘法运算。要实现3x3内核寻址,您应该维护3个指针(每行一个指向当前位置),或者一个指针和一个常量“跨步”(行间位移),并将其添加进去。使用多个循环知道何时添加/减去步幅。该死。没有更多的字符,所以现在我有4个侧面的情况下处理,并将手工编码的角落情况。内核的3指针方法似乎是最好的,因为在处理边界情况时,我可以单独禁用每个内核行。考虑到这一点,我可以继续类似的图像阵列,并有一个更容易的时间将它们分离,以便稍后CUDA实现,这是我的最终目标。谢谢。PS:我想找一本关于数组展开和寻址优化的书或教程。我想这不会占用太多内存。我可能会尝试在整个数组周围添加一个边框行,但这会涉及到复制数组,这可能不是最有效的方法(同样,也可能是,这取决于处理器的缓存策略)