【问题标题】:Segmentation Fault C++ Matrix分段错误 C++ 矩阵
【发布时间】:2019-09-25 03:22:38
【问题描述】:

我想让任意矩阵[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);

【问题讨论】:

  • for(int j = n; j &gt;= i; j++),真的吗?
  • 你想改变矩阵还是只在正确的地方输出一些零而不改变它?
  • 您只需要左下角的零,还是需要对矩阵进行数学上适当的更改,从而产生相应的上三角版本?
  • edit你的问题告诉我们你做了什么样的调试。我希望您已经在 Valgrind 或类似的检查器中运行了您的minimal reproducible example,并使用诸如 GDB 之类的调试器进行了调查。确保您也启用了全套编译器警告。这些工具告诉了你什么,它们缺少什么信息?并阅读 Eric Lippert 的 How to debug small programs

标签: c++ pointers


【解决方案1】:

这里

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

您从数组维度的上边界的 n 开始并向上计数,
很快你就可以访问你的阵列之外的东西,如果你幸运的话,这会给你带来一个段错误。

随意猜测

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

倒计时。

【讨论】:

    【解决方案2】:

    更新

    假设您的问题是关于矩阵对角化(正如 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
    

    【讨论】:

    • 请不要只说有问题,还要解释。还要解释你的解决方案。这将有助于消除 StackOverflow 是免费代码编写服务的误解。
    • 我提供了一个不同的解决方案,因为您已经触及了一些问题并给出了您的解决方案。 @Yunnosch
    • 是的,这是一个不同的解决方案。它仍然不是一个解释的解决方案。你现在甚至删除了最后一点解释,你发现了不止一个问题。当我要求(更多)解释时,这不是我的想法。
    • 另外,我相信 OP 可能不满足于仅将矩阵中的许多条目归零,因为这在数学上可能不是他们努力的目标......尤其是看到您的解决方案没有改变矩阵,并且在输出时仅将其条目部分替换为 0。考虑使用您的评论权限来提出相应的澄清问题。也许您对问题目标的解释是正确的。
    • 并且您正在代表 OP 做出决定和假设(不清楚,不是需要什么......等等)。让他/她自己决定,好吗? @Yunnosch
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多