我有一个巨大的代码使用由指针管理的3D数组.就像是:
int *** tab;
tab = malloc(m*sizeof(int**));
for(i= 1..n) tab[i] = malloc(n*sizeof(int*));
... etc...
Run Code Online (Sandbox Code Playgroud)
然后使用以下方法访问元素:
tab[i][j][k] = ...
Run Code Online (Sandbox Code Playgroud)
但由于此结构的特定问题,我想将tab声明为连续数组,但仍然在代码中使用带有3个括号的语法.编译器将在内部替换它们,如下所示:
tab[i][j][k] = ... => tab[i*m*n+j*m+k] = ...
Run Code Online (Sandbox Code Playgroud)
因此只使用一个指针解引用访问该数组.我不想更改源代码(没有sed).
例如,我可以通过在堆栈中声明制表符来完成此操作:
int tab[n][m][l];
Run Code Online (Sandbox Code Playgroud)
但不幸的是,如果m并且n是运行时变量,这不起作用.
警告:实际上它不是由于2的幂而是奇偶校验.请参阅编辑部分.
我找到了一个显示相当奇怪行为的代码.
代码使用2D数组(大小x大小).当size为2的幂时,代码的速度在10%到40%之间,最慢的是size = 32.
我用英特尔编译器获得了这些结果.如果我使用gcc 5.4编译,2问题的能力消失但代码慢3倍.在不同的CPU上测试它,我认为它应该足够可重复.
码:
#define N 10000000
unsigned int tab1[TS][TS];
void simul1() {
for(int i=0; i<TS; i++)
for(int j=0; j<TS; j++) {
if(i > 0)
tab1[i][j] += tab1[i-1][j];
if(j > 0)
tab1[i][j] += tab1[i][j-1];
}
}
int main() {
for(int i=0; i<TS; i++)
for(int j=0; j<TS; j++)
tab1[j][i] = 0;
for(int i=0; i<N; i++) {
tab1[0][0] = 1;
simul1();
}
return tab1[10][10];
}
Run Code Online (Sandbox Code Playgroud)
汇编:
icc:
icc main.c -O3 -std=c99 -Wall -DTS=31 -o …Run Code Online (Sandbox Code Playgroud) 我想检查每个Canny检测到的边缘并查找其中的主线(检查它们是否看起来形成一个矩形,例如,如果2对线是平行的等等).
Imgproc.HoughLinesP做我想要的,但它给出了整个图像的线条,我想知道哪些线条来自相同的边缘.
我也尝试使用FindContours,并使用approxPolyDP在每个轮廓中寻找主线,但这看起来并不适合,因为Canny检测到的边缘经常存在间隙.这给出了边缘的轮廓而不是边缘本身.
这是一个测试图像示例:
如何为每个形状获得一组线?