我正在尝试编写一个获取矩阵和维度(正方形)的函数,并在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;
}
答案 0 :(得分:2)
这一行包含一个主要错误,当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以帮助您理解原因)。
答案 1 :(得分:1)
分配内存时,请始终使用正确的大小类型。即使需要 a=2
b=3
abcocc=`awk '$0~/abc/{print NR}' txt | awk -v occ=$a 'NR==occ{print $0}' `
naveenocc=`awk '$0~/naveen/{print NR}' txt | awk -v occ=$b 'NR==occ{print $0}'`
1) awk -v abc=$abcocc -v naveen=$naveenocc 'NR>=abc&&NR<=naveen{print $0}' txt
2) awk -v abc=$abcocc -v naveen=$naveenocc 'NR>abc&&NR<naveen{print $0}' txt
或指针,您也可以在任何地方使用sizeof(int)
。提示:使用double
。这样,您始终使用正确的大小。
注意:请勿投放sizeof(*<pointer you assign the result to>)
&amp;返回的void *
。朋友。