带矩阵存储偏移

时间:2012-11-04 12:47:08

标签: c++ pointers sparse-matrix

我试图理解如何存储波段矩阵,我在“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?
}

1 个答案:

答案 0 :(得分:3)

这用于存储矩阵的紧凑方式,该矩阵在主对角线的左侧具有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[]