0

バンド行列を格納する方法を理解しようとしていたのですが、「C++ and Object Oriented Numeric Computing」という本で例を見つけましたが、行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?
}
4

1 に答える 1

3

Pこれは、主対角の左側にR非ゼロの対角があり、右側に非ゼロの対角があり、他のすべての要素がゼロである行列をコンパクトな方法で格納するために使用されます。行ごとP+R+1に、主対角線の周囲の要素にのみスペースを割り当てます。

bda[i] += P線は、主対角線上のbda[i]要素を指しています。これにより、行列の使用がより便利になります。bda[i][0]はすべての主対角線上にありibda[i][1]は右bda[i][-1]の最初の対角線上にあり、 は左の最初の対角線上にあります。これにより、主対角線またはP毎回追加する必要はありません。これが役立つかどうかは、マトリックスの使用方法によって異なります。

これを行う場合は、前Pから減算する必要があることに注意してください。bda[i]delete[]

于 2012-11-04T12:57:40.450 に答える