最近在改进师兄无人驾驶的package里面的功能,由于package里面的矩阵乘法比较多,而且大多用for循环实现,而且点的信息是挨个儿处理的,如果for循环的每一步执行需要依据上一部的结果,显然GPU和CPU处理起来是大差不大的,但是,在点云处理的过程中,一帧数据中,点与点是相互独立的,这种FOR循环是可以放到GPU上面运行的,当点的数量较少时,显然计算机的CPU是可以处理的,但当时域范围的点增多时,CPU就明显的力不从心,所以我准备,将循环放到GPU上面去处理,最近做着做着有点而怀疑自己了,希望可以取得不错的效果吧。改完这个FOR,我准备优化那和loopclosure。
写一些关于指针的赋值操作,程序卡在了不知道怎么初始化数据,即把一个已知的矩阵赋值给定义的矩阵。
设p是指向二维数组a[m][n]的指针变量,由于a[0]、a[1]┅a[M-1]等各个行数组依次连续存储,则对于a数组中的任一元素a[i][j],指针的一般形式如下:
p+iN+j 相应的如果用p1来表示,则为(p1+i)+j
例如,有如下定义:
int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};
则数组a有3个元素,分别为a[0]、a[1]、a[2]。而每个元素都是一个一维数组,各包含4个元素,如a[1]的4个元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。
若有:
int p=a[0];
则数组a的元素a[1][2]对应的指针为:p+14+2
元素a[1][2]也就可以表示为:( p+14+2)
用下标表示法,a[1][2]表示为:p[14+2]
特别说明:
对上述二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象不同,a[0]是一维数组的名字,它指向的是a[0]数组的首元素,对其进行“”运算,得到的是一个数组元素值,即a[0]数组首元素值,因此,a[0]与a[0][0]是同一个值;而a是一个二维数组的名字,它指向的是它所属元素的首元素,它的每一个元素都是一个行数组,因此,它的指针移动单位是“行”,所以a+i指向的是第i个行数组,即指向a[i]。对a进行“”运算,得到的是一维数组a[0]的首地址,即 a与a[0]是同一个值。当用int p;定义指针p时,p的指向是一个int型数据,而不是一个地址,因此,用a[0]对p赋值是正确的,而用a对p赋值是错误的。这一点请读者务必注意。
⑵ 用二维数组名作地址表示数组元素。
另外,由上述说明,我们还可以得到二维数组元素的一种表示方法:
对于二维数组a,其a[0]数组由a指向,a[1]数组则由a+1指向,a[2]数组由a+2指向,以此类推。因此,a与a[0]等价、(a+1)与a[1]等价、(a+2)与a[2]等价,┅,即对于a[i]数组,由(a+i)指向。由此,对于数组元素a[i][j],用数组名a的表示形式为:
((a+i)+j)
指向该元素的指针为:
*(a+i)j
数组名虽然是数组的地址,但它和指向数组的指针变量不完全相同。
第一,指针变量的值可以改变,即它可以随时指向不同的数组或同类型变量,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组。
第二,数组名是指针,类型是指向元素类型的指针,但值是指针常量,声明数组时编译器会为声明所指定的元素数量保留内存空间。数组指针是指向数组的指针,声明指针变量时编译器只为指针本身保留内存空间。
//声明一个结构体类型 Matrix
struct Matrix
{
int width;
int height;
float *elements;
};
A->height = height1;
A->width = width1;
B->height= height2;
B->width= width2;
C->height = height3;
C->width = width3;
for (int i = 0; i < width1; ++i)
for(int j=0; j < height1; ++j)
{
A->*elements = M[0];
A->elements[i][j] = *(M + i*3 + j);
}
for (int i = 0; i < width2; ++i)
for (int j = 0; j < height2; ++j)
{
B->*elements = N[0];
B->elements[i][j] = *(N + i*1 +j);
}
//定义一个二维数组
float M[3][3] = [ctYaw*ctPitch-stYaw*stRoll*stPitch,-ctRoll*stYaw,ctYaw*stPitch+ctPitch*stYaw*stRoll;ctPitch*stYaw+ctYaw*stRoll*stPitch,ctYaw*ctRoll,stYaw*stPitch-ctYaw*ctRoll*ctRoll;-ctRoll*stPitch,stROll,ctRoll*ctPitch;]
//定义一个一维数组
float N[3][1] = [pointFrom->x,pointFrom->y,pointFrom->z]
上述代码块主要实现的功能为将M,N 矩阵的元素分别赋值给A,B矩阵。
欢迎批评指正。