我问这个是因为我的程序有两个乘法矩阵的函数,它们只乘以 4x4 和 4x1 矩阵。标题是:
double** mult4x1(double **m1, double **m2);
double** mult4x4(double **m1, double **m2);
他们做 m1*m2 并以 **double 形式返回,下面是 4x4 乘法的片段。
double** mult4x4(double **m1, double **m2){
double** result = (double**) malloc(sizeof(double)*4);
for (int i = 0; i < 4; i++) {
result[i] = (double*) malloc(sizeof(double)*4);
}
...multiply...
return result;
}
mult4x1 和 mult4x4 的区别仅在于它们内部使用的索引。
我有这 3 个矩阵:
double m1[4][4] = {
{2, 3, 5, 6},
{9, 8, 1, 7},
{5, 4, 3, 1},
{7, 6, 1, 2}
};
double m2[4][4] = {
{1, 0, 0, 0},
{0, 1, 0, 0},
{0, 0, 1, 0},
{0, 0, 0, 1}
};
double m3[4][1] = {
{2},
{3},
{3},
{1}
};
尝试将这些矩阵相乘时会出错。
double** test = mult4x4(m1, m2);
double** test2 = mult4x1(identity4x4(), m3);
//identity4x4() creates a 4x4 identity matrix - double** identity4x4();
产量:
error: cannot convert
double (*)[4]' to
double*' for argument1' to
double* mult4x4(double*, double*)'error: cannot convert
double (*)[1]' to
double*' for argument2' to
double* mult4x1(double*, double*)'
double[][] 不应该等于 **double 吗?一个 double 组。 欢迎任何澄清、误解和错误。
最佳答案
没有。
double**
是指向 double (double*
) 的指针。
所以实际上它应该是这样创建的(注意第一个 malloc sizeof() 中的额外 *):
double** result = (double**) malloc(sizeof(double*)*4);
for (int i = 0; i < 4; i++) {
result[i] = (double*) malloc(sizeof(double)*4);
}
所以在内存中它看起来像这样:
[] -> { d,d,d,d }
[] -> { d,d,d,d }
[] -> { d,d,d,d }
[] -> { d,d,d,d }
有 4 个缓冲区可容纳 4 个 double ,但不是连续的。
虽然您的 double[4][4] 是内存中的连续缓冲区,但如下所示:
{ { d,d,d,d } { d,d,d,d } {d,d,d,d} {d,d,d,d} }
关于c++ - double[][] 不等于 **double 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19636809/