我想让任何矩阵[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);
答案 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];
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