频段矩阵存储偏移

Band matrix storage offset

本文关键字:存储 段矩阵      更新时间:2023-10-16

我试图了解如何存储频段矩阵,我在书中找到了一个示例," C 和面向对象的数字计算",但我无法弄清楚该行的目的是什么strong> 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 nonzero对角的矩阵,右侧为 R nonzero对角,所有其他元素为零。对于每一行,我们仅分配主角周围的P+R+1元素的空间。

bda[i] += P线使bda[i]指向主对角线上的元素。这可以使使用矩阵更加方便:bda[i][0]在每个i的主角上,bda[i][1]在右侧的第一个对角线上,bda[i][-1]在左侧的第一个对角线上等等。这使您可以在上面找到元素主角或附近无需每次添加P。这是否有用取决于您如何使用矩阵。

请注意,如果您这样做,则需要在delete[]之前从bda[i]中减去P