正如 Aron 在他的评论中指出的那样,实际上很少有矩阵存储在嵌套指针数据结构中。多级间接(我被告知)会导致相当大的性能损失,并且需要多次分配和释放(更多的性能问题,以及更多的搞砸和段错误的可能性)。我只见过几次用于存储矩阵的嵌套指针(在 CHEMKIN 中,我认为也在 Cantera 中)。更常见的做法是将数据存储在与单个指针关联的内存中。BLAS 和 LAPACK 的 C 接口使用这种做法。
你可能想做一些更像
double *A;
A = (double *) malloc(sizeof(double) * m * m * n);
// A[(i - 1) * m * m + (j - 1) * m + k] == A[i][j][k]
其中i, j, k指的是传统的基于一的数学指标;这种数据排列称为行优先排序。
然后,要进行您想要的切片,您需要将数据复制A到另一个指针:
double *B;
B = (double *) malloc(sizeof(double) * m * m);
// Here, zero-based indexing is used instead of the one-based indexing in the
// last code snippet.
for (j = 0; j++; j < m) {
for (k =0 ; k++; k < m) {
B[j * m + k] = A[i * m * m + j * m + k]; // B == A[i, :, :]
}
}
可能有更巧妙的方法来执行此操作,使用类似的东西memcpy,但您仍然需要将数据复制到另一个数据结构。
让我们假设您继续执行当前代码,并进一步假设您继续执行将矩阵存储在嵌套指针中的策略。要 slice A,您可以执行以下操作:
double **B;
B = (double **) malloc(sizeof(double *) * m);
// Zero-based indexing also used in this code snippet.
for (j = 0; j++; j < m) {
B[j] = (double *) malloc(sizeof(double *) * m);
for (k = 0; k++; k < m) {
B[j][k] = A[i][j][k];
}
}
同样,可能有更巧妙的方法来进行这种复制,例如使用memcpy.
除了 MATLAB,Fortran 90/95/2003/2008 和 Python 等语言本身也支持数组切片语法。