c - 运行时错误,C 中的 NxN 矩阵求逆

标签 c function matrix runtime-error matrix-inverse

我正在尝试编写一个函数来获取矩阵和维度(正方形),并返回 C 中的逆矩阵。 此外,我将用它来求解最小二乘矩阵解函数!

我从网上获得了大部分的想法和算法,并尝试根据我的程序进行更改。当我构建并运行它时(在 Code::Blocks 和 ideone.com 在线编译器中),我得到运行时错误或不相关的结果。 如果有人可以帮助我,那就太好了。

这是我的代码:

/* Inverse of NxN matrix */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double CalcDeterminant(int D, double matrix[D][D])
{
  /* Conversion of matrix to upper triangular */
int i, j, k;
double ratio, det=1;
for (I = 0; I < D; i++) {
    for(j = 0; j < D; j++){
        if(j>i){
            ratio = matrix[j][i]/matrix[i][i];
            for(k = 0; k < D; k++){
                matrix[j][k] -= ratio * matrix[i][k];
            }
        }
    }
 }

 for(i = 0; i < D; i++)
 {
    det *= matrix[i][i];
 }

 return det;
}


double ** MatrixInverse(int size, double matrix[size][size])
{
int p,q,m,n,i,j,k;
double det;
double **m_inverse = (double **) malloc(sizeof(int) * size);
for (k = 0; k < size; k++) {
 m_inverse[k] = (double *) malloc(sizeof(int) * size);
}

double **dummy = (double **) malloc(sizeof(int) * size);
for (k = 0; k < size; k++) {
dummy[k] = (double *) malloc(sizeof(int) * size);
}
 /////////////////////////
 for (q=0;q<size;q++)
 {
     for (p=0;p<size;p++)
     {
         m=0;
         n=0;
         for (i=0;i<size;i++)
         {
             for (j=0;j<size;j++)
             {
                 if (i != q && j != p)
                 {
                    dummy[m][n]=matrix[i][j];
                    if (n<(size-2))
                    {
                       n++;
                    }
                    else
                    {
                        n=0;
                        m++;
                    }
                 }
             }
         }
        det = CalcDeterminant(size-1, dummy);
        printf("%f\n", det);
        m_inverse[q][p]=pow(-1,(q+p))*det;
     }
  }
  for (i=0;i<size;i++)
 {
     for (j=0;j<size;j++)
     {
         dummy[i][j]=m_inverse[j][i];
     }
 }
   det=CalcDeterminant(size, matrix);
 for (i=0;i<size;i++)
 {
     for (j=0;j<size;j++)
     {
         m_inverse[i][j]= dummy[i][j] / det;
     }
  }


 for(i = 0; i < size; i++)
    free(dummy[i]);
 free(dummy);    

return m_inverse;

}


int main()
{
int i, j;
int D = 5;
 // just an example matrix
double A[5][5] = {{1,2,3,4,6},
                  {6,1,5,3,8},
                  {2,6,4,9,9},
                  {1,3,8,3,4},
                  {5,7,8,2,5}};

printf("Original matrix\n");
for(i=0; i<D; i++)
{
    for(j=0; j<D; j++)
    {   
    //  A[i][j] = i+j-5;
        printf("%f\t", A[i][j]);
    }
    printf("\n");
} 
double **A_inverse = MatrixInverse(D, A); 
printf("Inverse Matrix\n");
for(i=0; i<D; i++)
{
    for(j=0; j<D; j++)
    {   
        printf("%f\t", A_inverse[i][j]);
    }
    printf("\n");
}

det = CalcDeterminant(D, A);
printf("%f\n", det);
return 0;
}

最佳答案

这一行包含一个主要错误,当 sizeof(int) 不等于 sizeof(int *) 时会导致问题(这通常发生在64 位平台):

double **m_inverse = (double **) malloc(sizeof(int) * size);

dummy的分配相同。

您正在为 int 分配一个指针数组,所以这里的正确是

double **m_inverse = malloc(sizeof(int *) * size);

后来你在这里有一行有问题:

det = CalcDeterminant(size-1, dummy);

通常指向某种类型的指针与某种类型的数组数组相同(参见例如 this old answer of mine 以帮助您理解原因)。

关于c - 运行时错误,C 中的 NxN 矩阵求逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31453069/

相关文章:

javascript - 使用参数重命名函数而不重写它们 - Javascript

c++ - RcppArmadillo expmat 挂起 4x4 矩阵

android - 如何在进程之间将文件描述符传递给 Ashmem

c - 有没有办法在不退出 switch 语句的情况下通过 switch case 中途更改局部变量?

使用 select() 连续读取 FIFO

c++ - 程序可以编译,但分解成函数后实际上并不能移动电机

PHP/MySQL - 调用成员函数 query()

matlab - 如何在给定旋转点、旋转角度和旋转轴(n-2 子空间)的情况下计算 n 维旋转矩阵

java - 用Java将两个矩阵相乘

java - 在 HP-UX 环境 JVM 中,C 堆与 Java 堆中运行的是什么?