//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++实现矩阵类矩阵行列式,伴随矩阵,逆矩阵的更多相关文章

  1. 矩阵类的python实现

    科学计算离不开矩阵的运算.当然,python已经有非常好的现成的库:numpy. 我写这个矩阵类,并不是打算重新造一个轮子,只是作为一个练习,记录在此. 注:这个类的函数还没全部实现,慢慢在完善吧. ...

  2. OpenGL矩阵类(C++)

    概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例:投影矩阵 概述 OpenGL固定功能管线提供4个不同类型的矩阵(GL_MODELVIEW.GL_PROJECTION. ...

  3. OpenGL矩阵类(C++) 【转】

    http://www.cnblogs.com/hefee/p/3816727.html OpenGL矩阵类(C++) 概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例: ...

  4. NPOI操作EXCEL(六)——矩阵类表头EXCEL模板的解析

    哈哈~~~很高兴还活着.总算加班加点的把最后一类EXCEL模板的解析做完了... 前面几篇文章介绍了博主最近项目中对于复杂excel表头的解析,写得不好,感谢园友们的支持~~~ 今天再简单讲诉一下另一 ...

  5. [Java]编写自己的Matrix矩阵类

    用java实现一个简单的矩阵类,可以实现简单的矩阵计算功能. class Matrix 1.向量点乘 public static double dot(double[] x,double[] y) 2 ...

  6. 精解Mat类(一):基本数据类型-固定大小的 矩阵类(Matx) 向量类(Vector)

    一.基础数据类型 1.(基础)固定大小矩阵类 matx 说明: ①    基础矩阵是我个人增加的描述,相对于Mat矩阵类(存储图像信息的大矩阵)而言. ②    固定大小矩阵类必须在编译期间就知晓其维 ...

  7. C++实现矩阵类和向量类

    C++期末作业内容,写完之后觉得过于臃肿,又重新搞了个新的.新的当作业交,旧的拿来给同学参考. [问题描述]请仿照复数类,设计一个矩阵类,设计矩阵类的构成元素 1.编写构造函数完成初始化 2.编写成员 ...

  8. MATLAB特殊矩阵以及矩阵转置

    特殊矩阵 通用特殊矩阵 zeros函数:产生全0矩阵,即零矩阵. ones函数:产生....1矩阵,即幺矩阵. eye函数:产生对角线为1的矩阵,当矩阵是方正时,得到单位矩阵. rand函数:产生(0 ...

  9. 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式

    矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d     ...

随机推荐

  1. IKONS – 赞!264 款手工打造的免费矢量图标

    IKONS 是一套免费的矢量图标集,包含264款手工精心制作的可伸缩的矢量图标,分享给网页设计人员和开发人员.这些图标提供了 SVG.AI.ESP.PSD.CSH 和 PNG 格式.所有的图标都可以免 ...

  2. 为你的网页图标(Favicon)添加炫丽的动画和图片

    Favico.js 在让你的网页图标显示徽章,图像或视频.你设置可以轻松地在网页图标中使用动画,可以自定义类型的动画,背景颜色和文字颜色.它支持的动画,像幻灯片,渐变,弹出等等. 您可能感兴趣的相关文 ...

  3. 乱码之MyEclipse控制台

    今天突然发现控制台出现乱码,查了资料解决方案不一. 我的解决方案如下: Run -> Debug Configuration... -> MyEclipse Servler -> M ...

  4. Ajax中get和post使用问题

    使用get遇到的问题: 1.问题一. 缓存:当每次访问的url相同,客户端直接读取本地缓存里面的内容,即使后台数据变化前台也不会有变化: 解决方法:在?后面链接一个num=[随机数Math.rando ...

  5. 教你写能被舒服舒服又舒服地调用的iOS库

    目录 前言 脑洞开一开 分析 整容 结语 前言 2014年过的那么快,过年又那么块,2015年又是飞快地节奏,真尼玛感觉上帝是不是无聊使用了变速外挂开启了加速模式~到现在博主都无法接受已经上班的事实… ...

  6. Hadoop 2.5.1集群安装配置

    本文的安装只涉及了hadoop-common.hadoop-hdfs.hadoop-mapreduce和hadoop-yarn,并不包含HBase.Hive和Pig等. http://blog.csd ...

  7. Ubuntu开机黑屏,无法进入系统

    今天早上起来开机发现Ubuntu进不去了,启动项选择之后长时间的black of screen,击键盘.点鼠标毫无反应,后来实在等不下去了就按了一下电源键,以平时的性格就是强制关机的,这次轻轻碰一下就 ...

  8. iOS创建、删除文件夹、获取沙盒路径

    1.获取沙盒路径 // 获取沙盒路径 NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent: ...

  9. tomcat <context path>的意义及作用

    context path 是在tomcat 要支持多个应用时对每个应用的docBase做区别时的区分符. 打个比方假如你有两个请求:一个为 http:localhost:8080/test1/hell ...

  10. GCD基础知识总结

    iOS三种多线程编程技术: 1.NSThread 2.NSOperation 3.GCD(Grand Central Dispatch) 从上到下,抽象度层次从低到高,抽象度越高的使用越简单,也是Ap ...