导航:首页 > 编程语言 > 矩阵求逆c代码

矩阵求逆c代码

发布时间:2025-05-10 05:54:40

A. 用c语言怎么编写输入一个矩阵求其逆矩阵的程序

这是我编的一个简易矩阵计算器,C++语言,非常容易理解的,你可以参考求行列式和逆部分
#include <iostream>
#include <iomanip>
#include <conio.h>
#include "windows.h"
#include <string>
using namespace std;

void gotoxy(int x,int y) // 列x: 0~79 行y: 0~24
{ HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
COORD coordScreen={x,y};
SetConsoleCursorPosition(hConsole,coordScreen);
return;
}
void setcolor(unsigned short ForeColor,unsigned short BackColor)
// 0--黑 1--暗蓝 2--暗绿 3--暗青 4--暗红 5--暗紫 6--蟹黄 7--暗白
// 8--灰 9--亮蓝 10-亮绿 11-亮青 12-亮红 13-亮紫 14-黄 15-亮白
{ HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,(ForeColor % 16)|(BackColor % 16 * 16));
};

int main()
{
void plu();
void sub();
void amo();
void mul();
void ran();
void ord();
char sel='1';
while(sel != '0')
{ int i;
system("cls"); // 清屏
setcolor(15,0); // 下面显示黑底亮青字
gotoxy(8,1); cout<<"┌───────────────────────────┐";
for(i=2;i<20;i++)
{gotoxy(8,i);cout<<"│";gotoxy(64,i);cout<<"│";}
setcolor(15,6); // 下面显示红底白字
gotoxy(10,3); cout<<" ";
gotoxy(10,4); cout<<" 简 易 矩 阵 计 算 器 ";
gotoxy(10,5); cout<<" ";
setcolor(15,0); // 下面显示黑底亮青字
gotoxy(10,7); cout<<" 1 ---- 矩阵加法 2 ---- 矩阵减法 ";
gotoxy(10,9); cout<<" 3 ---- 矩阵数乘 4 ---- 矩阵乘法 ";
gotoxy(10,11); cout<<" 5 ---- 矩阵行列式 6 ---- 矩阵的逆 ";
gotoxy(10,13); cout<<" 0 ---- 退出 ";
gotoxy(10,15); cout<<" 请选择(0--6):";
gotoxy(8,20); cout<<"└───────────────────────────┘";
do
{ gotoxy(28,15); sel=getche( );}
while ( sel!='1' && sel!='2' && sel!='3' && sel!='4' && sel!='5' && sel!='6'&& sel!='0');

switch(sel)
{
case '1':plu(); break;
case '2':sub(); break;
case '3':amo(); break;
case '4':mul(); break;
case '5':ran(); break;
case '6':ord(); break;
case '0': break;
}
}
system("cls");
gotoxy(25,10);
cout<<"谢 谢 使 用 系 统 !"<<endl;
return 0;
}

void plu()//加法
{ char l;
system("cls"); // 清屏
setcolor(14,0); // 下面用黑底黄字
int a,b,i,j;
gotoxy(0,0);cout<<">>>>>> 矩阵加法 ";
gotoxy(0,2);cout<<"请输入矩阵的行数:";
cin>>a;
cout<<endl;
cout<<"请输入矩阵的列数:";
cin>>b;
cout<<endl;
double m[10][10],n[10][10];
cout<<"请输入第一个矩阵:"<<endl;
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6*j+20,2*i+6); cin>>m[i][j];}
cout<<endl<<endl<<"请输入第二个矩阵:"<<endl;
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6*j+20,2*a+2*i+7);cin>>n[i][j];}
cout<<endl<<">>>>>>>"<<endl<<"矩阵加法结果为:";
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6*j+20,4*a+2*i+8);cout<<m[i][j]+n[i][j];}
gotoxy(0,6*a+9);
cout<<">>>>>>>>按任意键退出:";
l=getche();

}

void sub()//减法
{ char l;
system("cls"); // 清屏
setcolor(14,0); // 下面用黑底黄字
int a,b,i,j;
gotoxy(0,0);cout<<">>>>>矩阵减法";
gotoxy(0,2);cout<<"请输入矩阵的行数:";
cin>>a;
cout<<endl;
cout<<"请输入矩阵的列数:";
cin>>b;
cout<<endl;
double m[10][10],n[10][10];
cout<<"请输入第一个矩阵:"<<endl;
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6*j+20,2*i+6); cin>>m[i][j];}
cout<<endl<<endl<<"请输入第二个矩阵:"<<endl;
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6*j+20,2*a+2*i+7);cin>>n[i][j];}
cout<<endl<<">>>>>>>"<<endl<<"矩阵减法结果为:";
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6*j+20,4*a+2*i+8);cout<<m[i][j]-n[i][j];}
gotoxy(0,6*a+9);
cout<<">>>>>>>>按任意键退出:";
l=getche();

}

void amo()//数乘
{ char h;
system("cls"); // 清屏
setcolor(14,0); // 下面用黑底黄字
int a,b,i,j;
gotoxy(0,0);cout<<">>>>>>矩阵数乘";
gotoxy(0,2);cout<<"请输入矩阵的行数:";
cin>>a;
cout<<endl;
cout<<"请输入矩阵的列数:";
cin>>b;
cout<<endl;
double m[10][10],c;
cout<<"请输入矩阵:"<<endl;
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6*j+20,2*i+6);cin>>m[i][j];}
cout<<endl<<"请输入与矩阵相乘的实数:";
cin>>c;
cout<<endl<<endl<<"矩阵数乘结果为:";
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(8*j+20,2*a+2*i+9);cout<<m[i][j]*c;}
gotoxy(0,4*a+12);
cout<<">>>>>>>按任意键退出:";h=getche();
}

void mul()//乘法
{
char k;
system("cls"); // 清屏
setcolor(14,0); // 下面用黑底黄字
int a,b,c,i,j,q;
gotoxy(0,0);cout<<">>>>>>矩阵乘法";
gotoxy(0,2);cout<<"请输入第一个矩阵的行数:";
cin>>a;
cout<<endl<<"请输入第一个矩阵的列数:";
cin>>b;
cout<<endl<<"则第二个矩阵的行数也为:"<<b;
cout<<endl<<endl<<"请输入第二个矩阵的列数:";
cin>>c;
cout<<endl;
double m[10][10],n[10][10],p[10][10]={0};
cout<<"请输入第一个矩阵:"<<endl;
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6*j+18,2*i+10); cin>>m[i][j];}
cout<<endl<<endl<<"请输入第二个矩阵:";
for(i=0;i<b;i++)
for(j=0;j<c;j++)
{gotoxy(6*j+18,2*a+2*i+11);cin>>n[i][j];}
cout<<endl<<">>>>>>>"<<endl<<"矩阵相乘结果为: ";
for(i=0;i<a;i++)
for(j=0;j<c;j++)
for(q=0;q<b;q++) p[i][j]=p[i][j]+m[i][q]*n[q][j];
for(i=0;i<a;i++)
for(j=0;j<c;j++)
{gotoxy(10*j+18,2*a+2*b+2*i+12);cout<<p[i][j];}
gotoxy(16,2*a+2*b+2*i+15);
cout<<">>>>>>>按任意键退出:";k=getche();

}
//===================================================行列式

float Fun(int n1,float a1[10][10]);
void ran()
{
system("cls"); // 清屏
setcolor(15,0); // 下面用黑底黄字
char k;
int n,i,j;
cout<<">>>>>矩阵行列式"<<endl<<endl<<"请输入矩阵阶数: ";
cin>>n;
cout<<endl<<"请输入矩阵:"<<endl;
float a[10][10];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{gotoxy(6*j+12,2*i+4);cin>>a[i][j];}
cout<<endl<<"行列式为: "<<Fun(n,a)<<endl<<endl;
cout<<">>>>>>按任意键退出:";
k=getche();

}
float Fun(int n1,float a1[10][10])//求行列式的递归函数
{
int i_1,j_1,c;//c为数组b的行
float b[10][10];
int p=0,q=0;
float sum=0;
if(n1==1) return a1[0][0];
for(i_1=0;i_1<n1;i_1++)
{
for(c=0;c<n1-1;c++)
{if(c<i_1) p=0;
else p=1;
for(j_1=0;j_1<n1-1;j_1++)
{b[c][j_1]=a1[c+p][j_1+1];}
}
if(i_1%2==0)
q=1;
else q=(-1);
sum=sum+a1[i_1][0]*q*Fun(n1-1,b);
}return sum;
}

//================================================================

void ord()
{
char g;
system("cls"); // 清屏
setcolor(15,0); // 下面用黑底黄字
int i,j,n;
gotoxy(0,0);cout<<">>>>>矩阵的逆";
gotoxy(0,2);cout<<"请输入矩阵的阶数:";
cin>>n;
cout<<endl;
cout<<"请输入矩阵:";
float l[10][10],m[10][10],p;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{gotoxy(4*j+12,2*i+4); cin>>l[i][j];}
if(Fun(n,l)==0) cout<<endl<<"该矩阵无逆!!!"<<endl;
else
{p=Fun(n,l);
cout<<endl<<"矩阵的逆为: ";
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{{float f[10][10];
int r,w,e,d;//e为数组f的行数
for(int j_1=0,e=0;j_1<n-1,e<n-1;j_1++,e++)
for(int i_1=0,d=0;i_1<n-1,d<n-1;i_1++,d++)
{if(e<i) r=0;else r=1;
if(d<j) w=0;else w=1;
f[i_1][j_1]=l[i_1+w][j_1+r];};
if((i+j)%2==0) m[i][j]=Fun(n-1,f)/p;
else m[i][j]=-Fun(n-1,f)/p;
};
gotoxy(9*j+12,2*n+2*i+4);cout<<m[i][j];};};
cout<<endl<<endl<<">>>>>>按任意键退出:";g=getche();
}

B. C语言 求矩阵的逆

//源程序如下#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<iostream.h>
#include<stdlib.h>
#include<math.h>
#define max 100void inputstyle(int *); //输入函数
void input(int **,int); //输入函数
long danx(int **,int);
int sgnx(int);
void martx(int **,int);int main(void)
{
int style=0,i=0;
int matrix[max][max],*p[max];
for(i=0;i<max;i++)*(p+i)=matrix[i]; //*(p+i)是指针,指向第i个字符串
char exit1=' ';
while(exit1!='E'&& exit1!='e'){ printf("求n阶矩阵的逆\n"); inputstyle(&style);
input(p,style);
printf("原矩阵为:\n");
for(i=0;i<style;i++){
for(int j=0;j<style;j++){
printf("%4d",matrix[i][j]);

}
printf("\n");
}

martx(p,style);
printf("\n");
printf("Exit=e Continue=Press any key\n");
cin>>exit1;
fflush(stdin);
printf("\n\n"); }
return(0);
} void input(int **p,int n){

for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("输入矩阵(%d行,%d列)元素:",j+1,i+1);
*(*(p+j)+i)=0;
scanf("%d",*(p+j)+i);
fflush(stdin);
}
}
}void inputstyle(int *style){
do{
printf("输入矩阵n*n阶数n(0<n<%d):",max);
fflush(stdin);
scanf("%d",style);
fflush(stdin);
}while(*style<=0 && *style>max);

}long danx(int **p,int n){
int i=0,j1=0,k1=0,j2=0,k2=0;
long sum=0;
int operate[max][max],*po[max];
for(i=0;i<max;i++)*(po+i)=operate[i]; if(n==1)return *(*(p+0)+0);
else{
for(i=0;i<n;i++){
for(j1=1,j2=0;j1<n;j1++,j2++){
k1=-1;k2=-1;
while(k2<n-1){
k1++;
k2++;
if(k1==i)k1++;
*(*(po+j2)+k2)=*(*(p+j1)+k1);
}
}
/*for(int i1=0;i1<n-1;i1++){
for(int h1=0;h1<n-1;h1++){
printf("(%d,%d)%d ",i1,h1,*(*(po+h1)+i1));

}
printf("\n");
}*/

sum+=*(*(p+0)+i) * sgnx(1+i+1) * danx(po,n-1);
}
return sum;
}
}int sgnx(int i){
if(i%2==0)return(1);
else return(-1);
}void martx(int **p,int n){
int i=0,j=0,j1=0,k1=0,j2=0,k2=0,num=0;
int tramform[max][max];
int operate[max][max],*po[max];
for(i=0;i<max;i++)*(po+i)=operate[i];
num=danx(p,n);
if(num==0)printf("矩阵不可逆\n");
else{
if(n==1)printf("矩阵的逆为: 1/%d\n",num);
else{
printf("矩阵的逆为: 系数 1/%d *\n",num);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
j1=-1;j2=-1;
while(j2<n-1){
j1++;j2++;
if(j1==j)j1++; k1=-1;k2=-1;
while(k2<n-1){
k1++;
k2++;
if(k1==i)k1++;
*(*(po+j2)+k2)=*(*(p+j1)+k1);
}
}

tramform[i][j]=sgnx(2+i+j) * danx(po,n-1);
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%4d",tramform[i][j]);
}
printf("\n");
}
}
}
}
//运行结果//希望对你有帮助

C. c语言编写一个子函数求矩阵的逆矩阵

在C语言中编写一个子函数用于求矩阵的逆矩阵,可以采用按第一行展开计算行列式的值,再计算伴随矩阵的方法。以下是一个示例代码,其中包含求矩阵行列式的值和计算伴随矩阵的过程。这个函数能够处理N×N的矩阵。

首先定义一个函数getA,用于计算矩阵的行列式值。该函数采用递归的方式实现,对于N×N的矩阵,通过按第一行展开计算行列式的值。具体实现如下:

int getA(int arcs[N][N],int n) {
if(n==1) {
return arcs[0][0];
}
int ans = 0;
int temp[N][N];
int i,j,k;
for(i=0;i<n;i++) {
for(k=0;k<n-1;k++) {
int t = k;
if(k>=i) {
t = k+1;
}
for(j=0;j<n-1;j++) {
int t = j;
if(j>=i) {
t = j+1;
}
temp[t][k] = arcs[t+1][j+1];
}
}
int t = getA(temp,n-1);
if(i%2==0) {
ans += arcs[0][i]*t;
} else {
ans -= arcs[0][i]*t;
}
}
return ans;
}

接下来定义一个函数getAStart,用于计算伴随矩阵。通过计算每个元素对应的余子式,并进行符号调整,最终得到伴随矩阵。具体实现如下:

void getAStart(int arcs[N][N],int n,int ans[N][N]) {
if(n==1) {
ans[0][0] = 1;
return;
}
int i,j,k,t;
int temp[N][N];
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
for(k=0;k<n-1;k++) {
int t = k;
if(k>=i) {
t = k+1;
}
for(t=0;t<n-1;t++) {
int t = t;
if(t>=j) {
t = t+1;
}
temp[t][k] = arcs[t+1][j+1];
}
}
int t = getA(temp,n-1);
if((i+j)%2 == 1) {
ans[j][i] = - t;
} else {
ans[j][i] = t;
}
}
}
}

在主函数中,通过输入矩阵的大小和矩阵元素,调用上述两个函数计算矩阵的行列式值和伴随矩阵,从而得到矩阵的逆矩阵。示例代码如下:

int main() {
int arcs[N][N];
int astar[N][N];
int i,j;
int n;
while(scanf("%d",&n)!=EOF && n) {
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
scanf("%d",&arcs[i][j]);
}
}
int det = getA(arcs,n);
if(det != 0) {
getAStart(arcs,n,astar);
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
astar[i][j] /= det;
}
}
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
printf("%d ",astar[i][j]);
}
printf("\n");
}
} else {
printf("矩阵不可逆\n");
}
}
return 0;
}

以上代码实现了通过C语言求矩阵的逆矩阵,通过按第一行展开计算行列式的值和计算伴随矩阵的方法。需要注意的是,此代码假设输入的矩阵是可逆的,即行列式的值不为零。

D. 如何用c语言编写一个n阶方阵求逆的程序

为了用C语言编写一个N阶方阵求逆的程序,我们首先需要理解矩阵求逆的基本原理。给定一个N阶方阵A,其逆矩阵B满足AB=BA=I,其中I是单位矩阵。求逆矩阵的关键在于计算矩阵的行列式和伴随矩阵。

在C语言中,我们可以使用函数`inverse_matrix`来实现这一过程。首先,我们定义了一个`temp`变量来存储矩阵的行列式值。如果行列式的值为零,这意味着矩阵不可逆,因此我们不需要继续进行求逆的计算。

假设`sourceMatrix`是输入的矩阵,`numberOfRows`和`numberOfColumns`分别表示矩阵的行数和列数。我们先计算`sourceMatrix`的行列式。如果行列式不为零,我们继续执行下一步。

接下来,我们调用`adjoint_matrix`函数来计算伴随矩阵。伴随矩阵是通过将原矩阵的元素按照转置并改变符号来得到的。计算完伴随矩阵后,我们开始对结果矩阵进行元素除法,即将伴随矩阵的每个元素除以原矩阵的行列式值。

最终,`inverse_matrix`函数返回了求得的逆矩阵。整个流程概括了矩阵求逆的几个关键步骤:计算行列式、计算伴随矩阵、将伴随矩阵的元素除以行列式值以得到逆矩阵。

通过使用C语言的函数式编程风格,我们不仅实现了矩阵求逆的算法,而且确保了代码的清晰性和可读性。这种方式适用于需要高效率处理大型矩阵运算的应用场景,如科学计算、机器学习等领域。

阅读全文

与矩阵求逆c代码相关的资料

热点内容
dnf90版本召唤师武器 浏览:94
阿里巴巴网站不做了怎么退款 浏览:296
数控编程中用什么刀 浏览:647
ipadmini1升级92卡吗 浏览:705
上网下载什么app 浏览:262
flyme6测试版升级好吗 浏览:980
对文件的审核 浏览:104
隐藏文件删除后找不到 浏览:324
但是找不到该文件 浏览:514
农场是个什么网站 浏览:236
js获取text的value值 浏览:596
如何用编程绘制心脏图 浏览:865
tail查看gz压缩文件 浏览:201
在计算机编程语言中是什么意思 浏览:195
手机防爆膜代理微信号 浏览:291
文件夹做口罩 浏览:460
java中单引号转义 浏览:786
被墙app 浏览:400
如何快速提升网站流量 浏览:622
文件移出保密柜找不到了 浏览:955

友情链接