最近需要做一个项目需要进行矩阵运算,第一时间想到的就是一个Eigen的库,但是装好以后发现Eigen库无法实现变量X变量的矩阵类型(也可能是我没有发现怎么使用这个库)。
于是决定自己写一个矩阵。
最开始定义了一个结构体:
typedef struct
{
int row,col;//行,列
double **data;
}Matrix;
其中定义了一个二维指针作为存储矩阵内容内存空间的指引,首先需要根据行列申请一块内存空间:
void create()
{
double **_data = new double*[row];
for (int i = 0; i < row; i++)
{
_data[i] = new double[col];
}
data = _data;
}
以上代码可以直接放进结构体中,以上代码也花了一些时间理解,C++中无法直接使用new定义二维数组。
所以采用中转的思路,先定义一个二维指针**data指向一组一维指针数组,再为每一个指针分配一个一维数组。
如果难以理解可以看我打个比方,
有一个领队先找了10个小队长,10个小队长就是一个地址数组,int*[10],然后10个小队长又为自己各自找了9个队员,每个队长负责的小队就是一个数组,int[10],直接储存数据的数组,最后加起来就是一个10*10=100的二维数组。
以上就完成了二维数组内存空间的分配。
而向double **data中传入数据时需要注意double **和double[][]的区别
int a[2][2]={{...},{...}};
void fun(int **src)
{
...
}
main()
{
fun(a);
}
理论上来说a也是一个指针,是a[2][2]数组的首地址和&a[0][0]一个作用,但是fun(a)的写法在编译器中会报错,提示int a[2][2]无法转换为int **。如果非要传入参数可以使用fun((int **)a)直接强制转换,能够通过编译,但是会出现其他问题,不推荐这种方法。