c++实现矩阵类矩阵行列式,伴随矩阵,逆矩阵
//Matrix ver1.0
//只支持矩阵内部(方阵)的运算
#include<iostream>
#include<math.h>
using namespace std;
class matrix
{
double**num;
int **e;//单位矩阵
int r;
int c;
unsigned int *array;//为全排序原矩阵列标提供初始顺序模板
unsigned int*arr;//为全排序伴随矩阵列标提供初始顺序模板
int**b;//存放原矩阵列标
int j;//计数变量,原矩阵的全排列
int po;//计数变量,伴随矩阵的全排列 double **comp;//伴随矩阵
double**s;//存放每一个num的余子式
int**sb;//存放每一个余子式的列标 public:
double caculate();
matrix(int n, int m);//nrow
void setmat();
bool checkcomp() { if (po)return true; return false; }
void showm();
void showinver(double k);
void swap(unsigned int* array, int i, int j);
void FullArray(int n, int index);
int func(int n) { if (n == )return ; else return n*func(n - ); }
int ni(int a[], int n);
void sets(int a, int b);
double cacu(int a, int b);
void setcomp();
void showcomp();
void fullArray(int n, int index = );
void shows();
void showsb(); };
void matrix::shows()//r
{
for (int i = ; i < r - ; i++)
{
for (int j = ; j < c - ; j++)
cout << s[i][j] << " ";
cout << endl;
}
}
void matrix::showcomp()
{
for (int i = ; i < r; i++)
{
for (int j = ; j < c; j++)
cout << comp[i][j] << " ";
cout << endl;
}
}
void matrix::setcomp()
{
for (int i = ; i < r; i++)
for (int j = ; j < c; j++)
comp[i][j] = pow(-, j + i)*cacu(i, j); }
double matrix::cacu(int a, int b)//计算每一位的代数余子式
{
sets(a, b);
double sum = ;
double *p = new double[c - ];
for (int i = ; i < func(c - ); i++)
{
p[i] = ;
for (int j = ; j < c - ; j++)
p[i] *= s[j][sb[i][j]];
p[i] = p[i] * pow(-, ni(sb[i], c - ));
sum += p[i];
}
return sum;
}
void matrix::sets(int a, int b)//把(a,b)的余子式存入**s
{
int t = ;
int *cun = new int[(c - )*(r - )];
for (int i = ; i < r; i++)
for (int j = ; j < c; j++)
{
if (i != a&&j != b)
{
cun[t] = num[i][j];
t++;
}
}
for (int i = ; i < r - ; i++)
for (int j = ; j < c - ; j++)
s[i][j] = cun[i*(r - ) + j];
}
void matrix::showm()//r
{
for (int i = ; i < r; i++)
{
for (int j = ; j < c; j++)
cout << num[i][j] << " ";
cout << endl;
}
}
int matrix::ni(int a[], int n)//逆序数
{
int s = ;
for (int j = n - ; j >= ; j--)
for (int i = ; i < j; i++)
{
if (a[j] < a[i])
s++;
}
return s;
}
void matrix::swap(unsigned int*array, int i, int j)//r
{
int t = array[i];
array[i] = array[j];
array[j] = t;
}
void matrix::showsb()
{
for (int i = ; i < func(r - ); i++)
{
for (int j = ; j < c - ; j++)
cout << sb[i][j];
cout << endl;
}
}
void matrix::fullArray(int n, int index)//对于伴随矩阵全排列
{
if (index >= n)
{
for (int i = ; i <n; ++i)
{
sb[po][i] = arr[i];
}
po++;
//return;
} for (int i = index; i < n; ++i)
{
swap(arr, index, i);
fullArray(n, index + );
swap(arr, index, i);
}
}
void matrix::FullArray(int n, int index)//r
{
if (index >= n)
{
for (int i = ; i <n; ++i)
{
b[j][i] = array[i];//把全排列存入b[][]中
}
j++;
} for (int i = index; i < n; ++i)
{
swap(array, index, i);
FullArray(n, index + );
swap(array, index, i);
}
} void matrix::showinver(double k)
{
for (int i = ; i < r; i++)
{
for (int j = ; j < c; j++)
cout << comp[i][j] / k << " ";
cout << endl;
}
}
matrix::matrix(int n, int m) :r(n), c(m)//r
{
j = ;
array = new unsigned int[c];
for (int i = ; i < c; i++)
array[i] = i;
arr = new unsigned int[c - ];
for (int i = ; i < c - ; i++)
arr[i] = i;
num = new double*[n];
b = new int*[func(c)];
for (int i = ; i < r; i++)
num[i] = new double[c];
for (int i = ; i < func(c); i++)
b[i] = new int[c];
e = ; sb = ;
s = ;
po = ;
if (r == c)
{
sb = new int*[func(c - )];
for (int i = ; i < func(c - ); i++)
sb[i] = new int[c - ];
s = new double*[r - ];
for (int i = ; i < r; i++)
s[i] = new double[c - ];
comp = new double*[r]; for (int i = ; i < r; i++)
comp[i] = new double[c]; e = new int*[r];
for (int i = ; i < r; i++)
e[i] = new int[c];
for (int i = ; i < r; i++)
for (int j = ; j < c; j++)
{
if (i == j)
e[i][j] = ;
else
e[i][j] = ;
}
}
}
void matrix::setmat()
{
cout << "请按行输入你的矩阵:" << endl;
for (int i = ; i < r; i++)
for (int j = ; j < c; j++)
cin >> num[i][j];
//num[i][j] = i*r + j;
}
double matrix::caculate()//计算原矩阵行列式
{
FullArray(c, );
double sum = ;
double *p = new double[c];
for (int i = ; i < func(r); i++)
{
p[i] = ;
for (int j = ; j < c; j++)
p[i] *= num[j][b[i][j]];
p[i] = p[i] * pow(-, ni(b[i], c));
sum += p[i];
}
return sum;
}
void main()
{
int C, R;
int choice = ;
matrix *p = ;
double k;//储存行列式的值
while (choice)
{
cout << "1:创建一个矩阵对象\n2:输出矩阵行列式的值\n3:输出伴随矩阵\n4:输出逆矩阵\n5:结束" << endl;
cout << "请输入你的选择" << endl;
cin >> choice;
switch (choice)
{
case :
cout << "请输入矩阵的行与列:" << endl;
cin >> C >> R;
p = new matrix(C, R);
p->setmat();
break;
case :
if (C == R)
{
k = p->caculate();
cout << "矩阵行列式的值:" << k << endl;
}
else
cout << "非方阵,无法计算" << endl;
break;
case :
if (C == R)
{
p->fullArray(C - , );//先给下标全排序好,存入相应数组
p->setcomp();
p->showcomp();
}
else
cout << "非方阵,无法计算" << endl;
break;
case :
if (C == R)
if (p->checkcomp())
p->showinver(k);
else
cout << "请先计算伴随矩阵。" << endl;
else
cout << "非方阵,无法计算" << endl;
break;
case :
choice = ;
break;
}
}
}
=====================6.18update&BUG已改===========================
c++实现矩阵类矩阵行列式,伴随矩阵,逆矩阵的更多相关文章
- 矩阵类的python实现
科学计算离不开矩阵的运算.当然,python已经有非常好的现成的库:numpy. 我写这个矩阵类,并不是打算重新造一个轮子,只是作为一个练习,记录在此. 注:这个类的函数还没全部实现,慢慢在完善吧. ...
- OpenGL矩阵类(C++)
概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例:投影矩阵 概述 OpenGL固定功能管线提供4个不同类型的矩阵(GL_MODELVIEW.GL_PROJECTION. ...
- OpenGL矩阵类(C++) 【转】
http://www.cnblogs.com/hefee/p/3816727.html OpenGL矩阵类(C++) 概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例: ...
- NPOI操作EXCEL(六)——矩阵类表头EXCEL模板的解析
哈哈~~~很高兴还活着.总算加班加点的把最后一类EXCEL模板的解析做完了... 前面几篇文章介绍了博主最近项目中对于复杂excel表头的解析,写得不好,感谢园友们的支持~~~ 今天再简单讲诉一下另一 ...
- [Java]编写自己的Matrix矩阵类
用java实现一个简单的矩阵类,可以实现简单的矩阵计算功能. class Matrix 1.向量点乘 public static double dot(double[] x,double[] y) 2 ...
- 精解Mat类(一):基本数据类型-固定大小的 矩阵类(Matx) 向量类(Vector)
一.基础数据类型 1.(基础)固定大小矩阵类 matx 说明: ① 基础矩阵是我个人增加的描述,相对于Mat矩阵类(存储图像信息的大矩阵)而言. ② 固定大小矩阵类必须在编译期间就知晓其维 ...
- C++实现矩阵类和向量类
C++期末作业内容,写完之后觉得过于臃肿,又重新搞了个新的.新的当作业交,旧的拿来给同学参考. [问题描述]请仿照复数类,设计一个矩阵类,设计矩阵类的构成元素 1.编写构造函数完成初始化 2.编写成员 ...
- MATLAB特殊矩阵以及矩阵转置
特殊矩阵 通用特殊矩阵 zeros函数:产生全0矩阵,即零矩阵. ones函数:产生....1矩阵,即幺矩阵. eye函数:产生对角线为1的矩阵,当矩阵是方正时,得到单位矩阵. rand函数:产生(0 ...
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
随机推荐
- Tab切换类型
Tab切换类型 点击Tab 滑过Tab 延迟Tab CSS样式 ; ; list-style:none; font-size:12px;} .notice{width:298px; height:98 ...
- 12款响应式的 jQuery 旋转木马(传送带)插件
在企业网站,作品集网站,电子商务网站或任何其他类型的网站内容显示图片可以使用 jQuery 旋转木马(传送带)插件来实现. jQuery 旋转木马插件允许开发人员以水平或垂直的方式显示内容,视频和图像 ...
- Ajax关于readyState(状态值)和status(状态码)的研究
var getXmlHttpRequest = function () { try{ //主流浏览器提供了XMLHttpRequest对象 return new XMLHttpRequest(); } ...
- 刷新拜拜~gulp-livereload
早就想要自动自动自动刷新了啊,曾经用grunt实现过,但是是yeoman建好的..其中很多任务我是用不到的啊,为了干净还是得要自己写啊哈哈(现在我只想要自动刷新). 首先node是必须的了-就不说怎么 ...
- ie8不兼容rgba的解决
借鉴................. 在调试ie8兼容性的问题时,发现ie8不支持rgba. 关于rgba(),即为颜色设置的方法函数,rgb代表颜色,a代表透明度. 如rgba(0,0,0,0.1 ...
- tableView的footerView下面的颜色修改、限制文本框的输入字数
- Android 国际化
由于公司的项目是投放 google play store , 所以要做国际化.国际化遇到的两个大问题 字符串国际化 布局样式国际化 一:字符串国际化 解决这个问题很简单,在res目录下放 ...
- 优化MySchool数据库(一)
<优化MyShcool数据库>:能够的独立的分析|设计|创建|运营|你的独立的数据库系统 设计--->实现--->TSQL--->查询优化---->性能优化技术-- ...
- iOS开发之 用第三方类库实现轮播图
在github上面有很多的第三方类库,大大节约了大家的开发时间 下载地址:https://github.com/gsdios/SDCycleScrollView 现已支持cocoapods导入:pod ...
- android [因为开了刷机精灵等软件 导致adb 无法使用]error: could not install *smartsocket* listener: cannot bind
今天 使用 刷机精灵后 在使用android studio 时发现 adb 无法正常使用. 于是 想重启 adb.exe , 直接在DOS里杀掉adb输入:adb kill-server 再启动输 ...