//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. Node-webkit 资料笔记

    静不下心写学习笔记了,因为发现了这篇文章:<用node-webkit开发多平台的桌面客户端> 另外官网上针对“package.json”的配置参数也已经很详尽了,连我英文不好的也差不多能看 ...

  2. Glide.js:响应式 & 触摸友好的 jQuery 滑块插件

    Glide.js 是一款响应式和对触摸友好的 jQuery 滑块.基于 CSS3 转换实现,并在低版本浏览器降级处理.Glide.js 简单,重量轻,快速,适用于智能手机,平板电脑和台式机.它支持 s ...

  3. oracle表的管理

    表名和列的命名规则 必须以字母开头: 长度不能超过30字符: 不能使用oracle的保留字: 只能使用如下字符:A-Z,a-z,0-9,$,#等:   数据类型: 字符型: char       定长 ...

  4. Request.MapPath和ServerMapPath

    一.路径 / 念 反斜杠,/ 是超文本协议的路径分隔符号,所有的网站在浏览器中显示的路径分隔都是以"/"表示.它一般代表虚拟路径. \ 念 斜杠,在普通程序代码中则以"\ ...

  5. [转]DevExpress v13.2 Beta版重要更新

    昨日,DevExpress隆重宣布发布v13.2.3测试版,想抢先尝鲜的朋友可以在这里下载哦.希望使用DevExpress旧版本的朋友,看到这些更新后能尽快更新你的代码,以免造成不必要的麻烦. Das ...

  6. 线程安全、数据同步之 synchronized 与 Lock

    本文Demo下载传送门 写在前面 本篇文章讲的东西都是Android开源网络框架NoHttp的核心点,当然线程.多线程.数据安全这是Java中就有的,为了运行快我们用一个Java项目来讲解. 为什么要 ...

  7. Android的进程等级

    Android五个进程等级 1.前台进程(Foreground process): 用户当前工作所需要的.一个进程如果满足下列任何条件被认为是前台进程: 正运行着一个正在与用户交互的活动(Activi ...

  8. 【C语言】C语言函数

    目录: 1. [函数注意点] 2. [函数目的] 3. [函数格式] 4. [函数定义前需明确的条件] 5. [函数的形参.实参] 6. [函数返回值注意点] 7. [为什么要return] 8. [ ...

  9. C语言实现泛型编程

    泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同.在C语言中,可以通过一些手段实现这样的泛型编程.这里介绍一种方法——通过无类型指针void* 看下面的一个实现 ...

  10. 转载:jsp中jstl标签的类似 if - else 语句 的语法

    原文链接:http://www.cnblogs.com/wanggd/archive/2013/05/27/3101788.html 在jsp中引入jstl的标签库和函数库 <%@ taglib ...