c++ - 带矩阵存储偏移

标签 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?
}

最佳答案

这用于存储主对角线左侧有 P 个非零对角线,右侧有 R 个非零对角线的矩阵,其中所有其他元素为零。对于每一行,我们只为主对角线周围的 P+R+1 元素分配空间。

bda[i] += P 行使 bda[i] 指向主对角线上的一个元素。这可以更方便地使用矩阵:bda[i][0] 在每个i 的主对角线上,bda[i][1 ] 在右边的第一个对角线上,bda[i][-1] 在左边的第一个对角线上,等等。这允许您在主对角线上找到元素或靠近它而不必每次都添加 P 。这是否有用取决于您如何使用矩阵。

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

关于c++ - 带矩阵存储偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13218647/

相关文章:

linux - 如何在不解压的情况下检查存档文件的实际大小?

python - 稀疏矩阵行中的连续元素

c++ - 带有字符的奇怪指针行为

c++ - 运算符 < 和 > 如何与指针一起使用?

C++ ...当所有参数都有默认值时

c++ - C++中的指针数组以及 "BUS ERROR"是什么

c++ - 我可以使用 if (pointer) 而不是 if (pointer != NULL) 吗?

c - C 中的指针优先级和取消引用

c++ - MATLAB编码器: sparse matrix

c++ - 在 C++ 中通过引用传递二维动态字符串数组