分段错误C ++矩阵

时间:2019-09-25 03:22:38

标签: c++ pointers

我想让任何矩阵[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 个答案:

答案 0 :(得分:1)

这里

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

从数组维数的上边界处的n开始,然后向上计数,
很快,您便可以进行阵列之外的访问,如果幸运的话,这会给您带来段段错误。

您想猜到

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

倒数。

答案 1 :(得分:0)

更新

假设您的问题是关于对角矩阵(如Eugene在评论部分中所述):

除了Yunnosch指出的那样,对角矩阵还意味着矩阵必须是正方形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