求大神帮我把这个C代码换成C++代码!!

VRkey 2014-04-21 08:27:30
求矩阵的逆矩阵
#include <stdlib.h>
#include <math.h>
#include <stdio.h>

double *inv(double *a,int n)
{
int *is,*js,i,j,k,l,u,v;
double d,p;
is=(int*)malloc(n*sizeof(int));
js=(int*)malloc(n*sizeof(int));
for (k=0; k<=n-1; k++)
{ d=0.0;
for (i=k; i<=n-1; i++)
for (j=k; j<=n-1; j++)
{ l=i*n+j; p=fabs(a[l]);
if (p>d) { d=p; is[k]=i; js[k]=j;}
}
if (d+1.0==1.0)
{ free(is); free(js); printf("err**not inv\n");
return NULL;
}
if (is[k]!=k)
for (j=0; j<=n-1; j++)
{ u=k*n+j; v=is[k]*n+j;
p=a[u]; a[u]=a[v]; a[v]=p;
}
if (js[k]!=k)
for (i=0; i<=n-1; i++)
{ u=i*n+k; v=i*n+js[k];
p=a[u]; a[u]=a[v]; a[v]=p;
}
l=k*n+k;
a[l]=1.0/a[l];
for (j=0; j<=n-1; j++)
if (j!=k)
{ u=k*n+j; a[u]=a[u]*a[l];}
for (i=0; i<=n-1; i++)
if (i!=k)
for (j=0; j<=n-1; j++)
if (j!=k)
{ u=i*n+j;
a[u]=a[u]-a[i*n+k]*a[k*n+j];
}
for (i=0; i<=n-1; i++)
if (i!=k)
{ u=i*n+k; a[u]=-a[u]*a[l];}
}
for (k=n-1; k>=0; k--)
{ if (js[k]!=k)
for (j=0; j<=n-1; j++)
{ u=k*n+j; v=js[k]*n+j;
p=a[u]; a[u]=a[v]; a[v]=p;
}
if (is[k]!=k)
for (i=0; i<=n-1; i++)
{ u=i*n+k; v=i*n+is[k];
p=a[u]; a[u]=a[v]; a[v]=p;
}
}
free(is); free(js);
return a;
}


void display(double M[],int n) /*显示结果*/
{

int i,j;
double *result=NULL,*A=NULL;

/*显示原矩阵*/
printf("\n\nThe OriginalMatrix is:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%10.4f\t", M[i*n+j]);

}
printf("\n");
}


A=(double*)malloc(n*n*sizeof(double));
for(i=0;i<n*n;i++) A[i]=M[i];
result=inv(A,n);
if(result!=NULL)
{
printf("\n\nThe InverseMatrix is:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%10.4f\t", result[i*n+j]);

}
printf("\n");
}
}
else
{
printf("The Matrix is singular ! Can't be inverse!\n");
}
free(A);
}


#include <conio.h>
/* Test */
void main()
{
double matrix[3][3]={{1,-5,-2},{-1,3,1},{3,-4,-1}};
double matrix1[3][3]={{0,0,0},{-1,3,1},{3,-4,-1}};
double matrix2[4][4]={{3,2,1,1},{2,3,5,9},{-1,2,5,-2},{1,0,-1,3}};
display(matrix[0],3);
display(matrix1[0],3);
display(matrix2[0],4);
printf("push any key to be end .");
getch();
}
求编译好用
...全文
182 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
泡面吧的?
引用 楼主 u014650107 的回复:
求矩阵的逆矩阵 #include <stdlib.h> #include <math.h> #include <stdio.h> double *inv(double *a,int n) { int *is,*js,i,j,k,l,u,v; double d,p; is=(int*)malloc(n*sizeof(int)); js=(int*)malloc(n*sizeof(int)); for (k=0; k<=n-1; k++) { d=0.0; for (i=k; i<=n-1; i++) for (j=k; j<=n-1; j++) { l=i*n+j; p=fabs(a[l]); if (p>d) { d=p; is[k]=i; js[k]=j;} } if (d+1.0==1.0) { free(is); free(js); printf("err**not inv\n"); return NULL; } if (is[k]!=k) for (j=0; j<=n-1; j++) { u=k*n+j; v=is[k]*n+j; p=a[u]; a[u]=a[v]; a[v]=p; } if (js[k]!=k) for (i=0; i<=n-1; i++) { u=i*n+k; v=i*n+js[k]; p=a[u]; a[u]=a[v]; a[v]=p; } l=k*n+k; a[l]=1.0/a[l]; for (j=0; j<=n-1; j++) if (j!=k) { u=k*n+j; a[u]=a[u]*a[l];} for (i=0; i<=n-1; i++) if (i!=k) for (j=0; j<=n-1; j++) if (j!=k) { u=i*n+j; a[u]=a[u]-a[i*n+k]*a[k*n+j]; } for (i=0; i<=n-1; i++) if (i!=k) { u=i*n+k; a[u]=-a[u]*a[l];} } for (k=n-1; k>=0; k--) { if (js[k]!=k) for (j=0; j<=n-1; j++) { u=k*n+j; v=js[k]*n+j; p=a[u]; a[u]=a[v]; a[v]=p; } if (is[k]!=k) for (i=0; i<=n-1; i++) { u=i*n+k; v=i*n+is[k]; p=a[u]; a[u]=a[v]; a[v]=p; } } free(is); free(js); return a; } void display(double M[],int n) /*显示结果*/ { int i,j; double *result=NULL,*A=NULL; /*显示原矩阵*/ printf("\n\nThe OriginalMatrix is:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%10.4f\t", M[i*n+j]); } printf("\n"); } A=(double*)malloc(n*n*sizeof(double)); for(i=0;i<n*n;i++) A[i]=M[i]; result=inv(A,n); if(result!=NULL) { printf("\n\nThe InverseMatrix is:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%10.4f\t", result[i*n+j]); } printf("\n"); } } else { printf("The Matrix is singular ! Can't be inverse!\n"); } free(A); } #include <conio.h> /* Test */ void main() { double matrix[3][3]={{1,-5,-2},{-1,3,1},{3,-4,-1}}; double matrix1[3][3]={{0,0,0},{-1,3,1},{3,-4,-1}}; double matrix2[4][4]={{3,2,1,1},{2,3,5,9},{-1,2,5,-2},{1,0,-1,3}}; display(matrix[0],3); display(matrix1[0],3); display(matrix2[0],4); printf("push any key to be end ."); getch(); } 求编译好用
  • 打赏
  • 举报
回复
C++直接调呗, extern "C"
mujiok2003 2014-04-22
  • 打赏
  • 举报
回复
求逆矩阵? 高斯消元法吧, 网上很多现成代码,搜索gaussj
赵4老师 2014-04-22
  • 打赏
  • 举报
回复
引用 1 楼 BeanJoy 的回复:
引用赵老师的话,1000行以内的代码不要用C++写。
记不得哪位C++大牛在哪本学习C++的书的前言里面说过 “用C语言1000行源码能完成的工作千万不要用C++重写!” 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。
VRkey 2014-04-21
  • 打赏
  • 举报
回复
这只是一部分。。 求帮忙!
BeanJoy 2014-04-21
  • 打赏
  • 举报
回复
引用赵老师的话,1000行以内的代码不要用C++写。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧