我试图了解如何存储能带矩阵,在《 C ++和面向对象的数值计算》一书中找到了一个示例,但我无法弄清bda [i] + = P行的目的是什么;这在尝试打印带矩阵时也给我带来了问题。这里是:
int N = 5; //Matrix of NxN
int P = 1; //Left bandwidth
int R = 2; //Right bandwidth
//Matrix A
double A[5][5] = { { 1, 6, 10, 0, 0 },
{ 13, 2, 0, 11, 0 },
{ 0, 14, 3, 8, 12 },
{ 0, 0, 0, 4, 9 },
{ 0, 0, 0, 16, 5 } };
//Allocate memory for rows
double** bda = new double*[N];
for (int i = 0; i < N; i++) {
bda[i] = new double[P + R + 1]; //Allocate memory for cols
bda[i] += P; //What's the purpose of this?
}
最佳答案
这是用于存储矩阵的紧凑方式,该矩阵在主对角线的左侧具有P
个非零对角线,在右侧具有R
个非零对角线,所有其他元素均为零。对于每一行,我们仅为主对角线周围的P+R+1
元素分配空间。bda[i] += P
线使bda[i]
指向主对角线上的元素。这样可以更方便地使用矩阵:bda[i][0]
位于每个i
的主对角线上,bda[i][1]
位于右侧的第一个对角线上,bda[i][-1]
位于左侧的第一个对角线上,依此类推。这使您可以查找主对角线上或附近的元素,而不必每次都添加P
。这是否有用取决于您如何使用矩阵。
请注意,如果执行此操作,则需要在P
之前从bda[i]
减去delete[]
。