让我们假设以下C(仅编辑C,而不是C ++)函数从两个矩阵A,B执行矩阵 - 矩阵乘法,并将结果存储在新分配的内存中(C):
double **MatrixMult(double **A, int rowA, int colA, double **B, int rowB, int colB)
{
double **C = createEmptyMatrix(rowA, colB);
int i; int j; int k;
for (i=0;i<rowA;i++)
{
for (j=0;j<colB;j++)
{
C[i][j] = 0;
for (k=0;k<rowB;k++)
C[i][j] += (A[i][k]*B[k][j]);
}
}
return C;
}
矩阵A和B的创建如下:
double **A = createEmptyMatrix(10,10);
double **B = createEmptyMatrix(10,10);
具有功能
double **createEmptyMatrix(int rows,int cols)
{
int i;
double **L;
L = (double **) malloc(rows*sizeof(double *));
for (i = 0; i < rows; i++){
L[i] = (double *) malloc(cols*sizeof(double));
}
return L;
}
现在,我尝试使用SAME函数乘以常量数组(矩阵),如
const double A_const[7][9] = {
{1.1,2.1,3.1,4.1,5.1,6.1,7.1,8.1,9.1},
{1.2,2.2,3.2,4.2,5.2,6.2,7.2,8.2,9.2},
{1.3,2.3,3.3,4.3,5.3,6.3,7.3,8.3,9.3},
{1.4,2.4,3.4,4.4,5.4,6.4,7.4,8.4,9.4},
{1.1,2.1,3.1,4.1,5.1,6.1,7.1,8.1,9.1},
{1.2,2.2,3.2,4.2,5.2,6.2,7.2,8.2,9.2},
{1.3,2.3,3.3,4.3,5.3,6.3,7.3,8.3,9.3}
};
具有非常数矩阵B(A_const的维度和内容随机选择)。
基本上,我尝试将const数组的双精度传递给假设double**
作为参数的函数。
我想避免更改函数“MatrixMult”的定义。那么,是否可以定义一个**(双指针)到一个常数数组?
答案 0 :(得分:1)
您可以创建指向2D数组每一行的指针数组:
double *A_const_p[] = { A_const[0], A_const[1],
A_const[2], A_const[3],
A_const[4], A_const[5], A_const[6]};
然后您可以将此数组传递给MatrixMult
。
但请注意,如果您不想更改功能定义,则需要从const
删除A_const
限定符。
您也无法更改接受const double **
的功能,因为无法为此参数传入double **
。有关详细信息,请参阅datalab to google.datalab Migration Guide。