Ошибка сегментации C ++ Matrix - PullRequest
1 голос
/ 25 сентября 2019

Я хочу, чтобы любая матрица [n] [n + 1] стала верхней треугольной матрицей [n] [n + 1].

Я сделал этот код, но это вызывает ошибку сегментации.

void diagonalizarMatriz(float** Matriz, int n){
for(int i = 0; i < n-1; i++)
    for(int k = 0; k < n; k ++)
        for(int j = n; j >= i; j++)
            Matriz[k][j] = Matriz[k][j] - ((Matriz[k][i] * Matriz[i][j]) / Matriz[i][i]);
}

int main(){
float** Matriz = new float* [3];
for(int i = 0; i < 3 ; i++)
    Matriz[i] = new float [4];

//test matrix
Matriz[0][0] = 1;
Matriz[0][1] = 4;
Matriz[0][2] = 52;
Matriz[0][3] = 57;
Matriz[1][0] = -27;
Matriz[1][1] = -110;
Matriz[1][2] = -3;
Matriz[1][3] = -134;
Matriz[2][0] = 22;
Matriz[2][1] = 2;
Matriz[2][2] = 14;
Matriz[2][3] = 38;

diagonalizarMatriz(Matriz, 3);

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Здесь

for(int j = n; j >= i; j++)

вы начинаете с n на верхней границе измерений вашего массива и начинаете отсчет,
очень скоро вы получите доступ к нему за пределами вашего массива, который при возникновении ошибкитебе везет.

По предположению, вы хотите

for(int j = n; j >= i; j--)

для обратного отсчета.

0 голосов
/ 25 сентября 2019

ОБНОВЛЕНИЕ

Предположим, что ваш вопрос касается диагонализации матрицы (как Юджин утверждает в разделе комментариев):

В дополнение к тому, на что указал Юннош, диагонализация матрицы означает, что матрица должнабыть квадратом n x n.Однако в main вы инициализируете его как матрицу 3 x 4.

Оригинальный код

float** Matriz = new float* [3];
for(int i = 0; i < 3 ; i++)
  Matriz[i] = new float [4];

Чтобы избавиться от ошибки сегмента, измените следующую часть в main (установите матрицу на 3 x 3):

float** Matriz = new float* [3];
for(int i = 0; i < 3 ; i++)
  Matriz[i] = new float [3];

//test matrix
Matriz[0][0] = 1;
Matriz[0][1] = 4;
Matriz[0][2] = 52;
Matriz[1][0] = -27;
Matriz[1][1] = -110;
Matriz[1][2] = -3;
Matriz[2][0] = 22;
Matriz[2][1] = 2;
Matriz[2][2] = 14;

Наконец,чтобы получить следующую матрицу (нижняя треугольная):

1 0 0
4 5 0
7 8 9

Удалите знак равенства из вашего третьего вложенного цикла:

for(int j = n; j > i; j--)

Я предполагаю, что отсюда вы можете пройти через это, чтобы сделать это upper-triangular matrix.

СТАРЫЙ ОТВЕТ

Попробуйте это:

int matrix[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int row = 3;
int col = 3;
int i, j; 
for (i = 0; i < row; i++) { 
  for (j = 0; j < col; j++) {
    if (i > j) { 
        cout << "0" << " "; 
    } else
        cout << matrix[i][j] << " "; 
  } 
  cout << endl; 
}

Даст вам эту матрицу

1 2 3
0 5 6
0 0 9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...