Смещение хранения матрицы диапазона

Я пытался понять, как хранить матрицу группы, я нашел пример в книге «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?
}

0

Решение

Это используется для компактного способа хранения матрицы, которая имеет 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[] Это.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]