这是我编的一个简易矩阵计算器,C++语言,非常容易理解的,你可以参考求行列式和逆部分
#include <iostream>
#include <iomanip>
#include <conioh>
#include "windowsh"
#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(6j+20,2i+6); cin>>m[i][j];}
cout<<endl<<endl<<"请输入第二个矩阵:"<<endl;
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6j+20,2a+2i+7);cin>>n[i][j];}
cout<<endl<<">>>>>>>"<<endl<<"矩阵加法结果为:";
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6j+20,4a+2i+8);cout<<m[i][j]+n[i][j];}
gotoxy(0,6a+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(6j+20,2i+6); cin>>m[i][j];}
cout<<endl<<endl<<"请输入第二个矩阵:"<<endl;
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6j+20,2a+2i+7);cin>>n[i][j];}
cout<<endl<<">>>>>>>"<<endl<<"矩阵减法结果为:";
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6j+20,4a+2i+8);cout<<m[i][j]-n[i][j];}
gotoxy(0,6a+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(6j+20,2i+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(8j+20,2a+2i+9);cout<<m[i][j]c;}
gotoxy(0,4a+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(6j+18,2i+10); cin>>m[i][j];}
cout<<endl<<endl<<"请输入第二个矩阵:";
for(i=0;i<b;i++)
for(j=0;j<c;j++)
{gotoxy(6j+18,2a+2i+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(10j+18,2a+2b+2i+12);cout<<p[i][j];}
gotoxy(16,2a+2b+2i+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(6j+12,2i+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]qFun(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(4j+12,2i+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(9j+12,2n+2i+4);cout<<m[i][j];};};
cout<<endl<<endl<<">>>>>>按任意键退出:";g=getche();
}
#include <vector>
#include <iomanip>
#include <cmath>
#include <iostream>
using namespace std;
double det(int N,vector<double> A)
{
double D=0;
vector<double> B((N-1)(N-1));
if(N==2)
return A[0]A[3]-A[1]A[2];
for(int i=0;i<N;i++)
{
for(int j=1;j<N;j++)
for(int p=1;p<N;p++)
{
for(int h=0;h<N-1;h++)
{
if(h<i)
B[(p-1)(N-1)+h]=A[pN+h];
else if(h>=i)
B[(p-1)(N-1)+h]=A[pN+h+1];
}
}
D+=pow(float(-1),i)A[i]det(N-1,B);
}
return D;
}
vector<double> adjoint(int N,vector<double> A)
{
vector<double> B(NN);
vector<double> M((N-1)(N-1));
for(int p=0;p<NN;p++)
{
int cel=p%N;
int row=(p-cel)/N;
for(int i=0;i<N-1;i++)
for(int j=0;j<N-1;j++)
{
if(i<row&&j<cel)
M[i(N-1)+j]=A[iN+j];
else if(i>=row&&j<cel)
M[i(N-1)+j]=A[(i+1)N+j];
else if(i<row&&j>=cel)
M[i(N-1)+j]=A[iN+j+1];
else
M[i(N-1)+j]=A[(i+1)N+j+1];
}
B[celN+row]=pow(float(-1),cel+row)det(N-1,M);
}
return B;
}
void main()
{
cout<<"输入矩阵的阶数N:"<<endl;
int N;
cin>>N;
cout<<"输入矩阵元素:"<<endl;
vector<double> A(NN);
vector<double> B(NN);
for (int i=0;i<N;i++)
for(int j=0;j<N;j++)
cin>>A[iN+j];
cout<<"您输入的矩阵为"<<endl;
for(int i=0;i<NN;i++)
{
cout<<setw(5)<<A[i];
if((i+1)%N ==0)
cout<<endl;
}
if(det(N,A)==0)
{
cout<<"该矩阵不存在逆矩阵"<<endl;
system("pause");
return;
}
B=adjoint(N,A);
cout<<"该矩阵的逆矩阵为"<<endl;
for(int i=0;i<NN;i++)
{
B[i]=B[i]/det(N,A);
cout<<setw(5)<<B[i];
if((i+1)%N ==0)
cout<<endl;
}
system("pause");
}
C++写的,用了我两个小时,可以求任意阶矩阵的逆,可能有bug,hehe。
矩阵求逆的快速算法
算法介绍
矩阵求逆在3D程序中很常见,主要应用于求Billboard矩阵。按照定义的计算方法乘法运算,严重影响了性能。在需要大量Billboard矩阵运算时,矩阵求逆的优化能极大提高性能。这里要介绍的矩阵求逆算法称为全选主元高斯-约旦法。
高斯-约旦法(全选主元)求逆的步骤如下:
首先,对于 k 从 0 到 n - 1 作如下几步:
从第 k 行、第 k 列开始的右下角子阵中选取绝对值最大的元素,并记住次元素所在的行号和列号,在通过行交换和列交换将它交换到主元素位置上。这一步称为全选主元。
m(k, k) = 1 / m(k, k)
m(k, j) = m(k, j) m(k, k),j = 0, 1, , n-1;j != k
m(i, j) = m(i, j) - m(i, k) m(k, j),i, j = 0, 1, , n-1;i, j != k
m(i, k) = -m(i, k) m(k, k),i = 0, 1, , n-1;i != k
最后,根据在全选主元过程中所记录的行、列交换的信息进行恢复,恢复的原则如下:在全选主元过程中,先交换的行(列)后进行恢复;原来的行(列)交换用列(行)交换来恢复。
实现(4阶矩阵)
float Inverse(CLAYMATRIX& mOut, const CLAYMATRIX& rhs)
{
CLAYMATRIX m(rhs);
DWORD is[4];
DWORD js[4];
float fDet = 10f;
int f = 1;
for (int k = 0; k < 4; k ++)
{
// 第一步,全选主元
float fMax = 00f;
for (DWORD i = k; i < 4; i ++)
{
for (DWORD j = k; j < 4; j ++)
{
const float f = Abs(m(i, j));
if (f > fMax)
{
fMax = f;
is[k] = i;
js[k] = j;
}
}
}
if (Abs(fMax) < 00001f)
return 0;
if (is[k] != k)
{
f = -f;
swap(m(k, 0), m(is[k], 0));
swap(m(k, 1), m(is[k], 1));
swap(m(k, 2), m(is[k], 2));
swap(m(k, 3), m(is[k], 3));
}
if (js[k] != k)
{
f = -f;
swap(m(0, k), m(0, js[k]));
swap(m(1, k), m(1, js[k]));
swap(m(2, k), m(2, js[k]));
swap(m(3, k), m(3, js[k]));
}
// 计算行列值
fDet = m(k, k);
// 计算逆矩阵
// 第二步
m(k, k) = 10f / m(k, k);
// 第三步
for (DWORD j = 0; j < 4; j ++)
{
if (j != k)
m(k, j) = m(k, k);
}
// 第四步
for (DWORD i = 0; i < 4; i ++)
{
if (i != k)
{
for (j = 0; j < 4; j ++)
{
if (j != k)
m(i, j) = m(i, j) - m(i, k) m(k, j);
}
}
}
// 第五步
for (i = 0; i < 4; i ++)
{
if (i != k)
m(i, k) = -m(k, k);
}
}
for (k = 3; k >= 0; k --)
{
if (js[k] != k)
{
swap(m(k, 0), m(js[k], 0));
swap(m(k, 1), m(js[k], 1));
swap(m(k, 2), m(js[k], 2));
swap(m(k, 3), m(js[k], 3));
}
if (is[k] != k)
{
swap(m(0, k), m(0, is[k]));
swap(m(1, k), m(1, is[k]));
swap(m(2, k), m(2, is[k]));
swap(m(3, k), m(3, is[k]));
}
}
mOut = m;
return fDet f;
}
比较
原算法 原算法(经过高度优化) 新算法
加法次数 103 61 39
乘法次数 170 116 69
需要额外空间 16 sizeof(float) 34 sizeof(float) 25 sizeof(float)
结果不言而喻吧。
以上就是关于用c语言怎么编写输入一个矩阵求其逆矩阵的程序全部的内容,包括:用c语言怎么编写输入一个矩阵求其逆矩阵的程序、c语言求逆矩阵、根据高斯消元法的思路,编写求逆矩阵的程序。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)