c++实现矩阵类矩阵行列式,伴随矩阵,逆矩阵

时间:2023-01-23 08:55:24
 //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矩阵类&lpar;C&plus;&plus;&rpar;

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

  3. OpenGL矩阵类&lpar;C&plus;&plus;&rpar; 【转】

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

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

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

  5. &lbrack;Java&rsqb;编写自己的Matrix矩阵类

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

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

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

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

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

  8. 矩阵乘法&amp&semi;矩阵快速幂&amp&semi;矩阵快速幂解决线性递推式

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

  9. C&plus;&plus;题解:Matrix Power Series ——矩阵套矩阵的矩阵加速

    Matrix Power Series r时间限制: 1 Sec 内存限制: 512 MB 题目描述 给定矩阵A,求矩阵S=A^1+A^2+--+A^k,输出矩阵,S矩阵中每个元都要模m. 数据范围: ...

随机推荐

  1. &period;net学习之委托和事件

    1.什么是委托通俗的说:委托就是一个能够存储符合某种格式(方法签名)的方法的指针的容器上传图片: 2.委托语法准备一个方法:string Hello(string userName){} string ...

  2. jquery&period;unobtrusive-ajax&period;js单独的用法

    (插件本身已经减少了人力,如果开始无脑开发,简直就是无能,@Ajax里面哪里帮助类生成的其实就是jquery.unobtrusive的一些特性) jquery.unobtrusive是MVC中出现的j ...

  3. BZOJ2752&colon; &lbrack;HAOI2012&rsqb;高速公路&lpar;road&rpar;

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 608  Solved: 199[Submit][ ...

  4. portal开发&quot&semi;下拉框&quot&semi;&OpenCurlyDoubleQuote;日期框”查询要怎么配置

    下面的这些是我今天的成果! 总的来说是一步一步摸索出来的!还是等感谢超哥的耐心指导,犯了一些错误! 1.比如在wd配置文件中中写id=“check_it_two”,在java中写成 checki_it ...

  5. BigDecimal 高精度计算 熟悉扩展,java除法保留小数问题

    java保留两位小数问题: 方式一: 四舍五入  double   f   =   111231.5585;  BigDecimal   b   =   new   BigDecimal(f);  d ...

  6. vue-devtools vue开发调试神器

    前言: 由于vue是数据驱动的,所以这就存在在开发调试中查看DOM结构并不能解析出什么. 但是借助vue-devtools插件,我们就可以很容易的对数据结构进行解析和调试. 一.下载chrome扩展插 ...

  7. thinkpad x260在ubuntu 14&period;04lts wifi驱动安装 ( ubuntu iwlwifi驱动 都可行 )

    实验室要新购笔记本x260,用于ROS调试,装上ubuntu-ros后,发现wifi不支持. 查阅大量资料,如下: http://www.ubuntu.com/certification/hardwa ...

  8. 简述在ADO中使用接口的抽象数据提供程序以及ADO&period;NET数据提供程序工厂模型

    如何在ADO中使用接口的抽象数据提供程序 在cofig中 appSettings下,配置数据连接类型 <appSettings> <!--这个键值映射到枚举值中的某个值--> ...

  9. MySQL的可重复读级别能解决幻读吗

    引言 之前在深入了解数据库理论的时候,了解到事物的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了.但是对于幻 ...

  10. java中fail-fast 和 fail-safe的区别

    java中fail-fast 和 fail-safe的区别   原文地址:http://javahungry.blogspot.com/2014/04/fail-fast-iterator-vs-fa ...