//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. Community Value再理解

    其实之前写“从香港机房引入google/bitbucket路由”的时候,对community value的了解还并不深入,对Juniper default BGP export/import poli ...

  2. Apple Watch PSD 源文件【免费素材下载】

    Apple Watch 是苹果公司于2014年9月发布的一款智能手表.分为运动款.普通款和定制款三种,采用蓝宝石屏幕,有银色,金色,红色,绿色和白色等多种颜色可以选择.这里分享的是 Apple Wat ...

  3. Marketing with Microsoft Dynamics CRM IDEA CONFERENCE

    Object:Marketing with Microsoft Dynamics CRM  IDEA CONFERENCE  24 SEPTEMBER 2015 | BROADCAST ONLINE ...

  4. SharePoint 2010 常用技巧及方法总结

    1.代码调试确定进程cd c:\windows\system32\inetsrvappcmd list wppause注:保存成批处理文件,查看进程.bat,用的时候双击即可 2.类似列表新建打开方式 ...

  5. Android HTTP实例 使用GET方法和POST方法发送请求

    Android HTTP实例 使用GET方法和POST方法发送请求 Web程序:使用GET和POST方法发送请求 首先利用MyEclispe+Tomcat写好一个Web程序,实现的功能就是提交用户信息 ...

  6. JNI在C 和 C++ 函数实现的不同

    在C中,JNI 函数调用由“(*env)->”作前缀,目的是为了取出函数指针所引用的值. 在 C++ 中,JNIEnv 类拥有处理函数指针查找的内联成员函数. 下面这两行代码访问同一函数,但每种 ...

  7. Android Studio Gradle Build Running 特别慢的问题探讨

    本文的本本win7 64bit 6G android studio2.1 在运行程序的时候Gradle Build Running 特别慢,一个helloworld都快2min了 1.开启gradle ...

  8. ios 返回指定导航控制器

    UINavigationController *navigationVC = self.navigationController; NSMutableArray *viewControllers = ...

  9. [转]android笔记--Intent和IntentFilter详解

    Intent用于启动Activity, Service, 以及BroadcastReceiver三种组件, 同时还是组件之间通信的重要媒介. 使用Intent启动组件的优势1, Intent为组件的启 ...

  10. ASP.NET中常用的几个李天平开源公共类LTP.Common,Maticsoft.DBUtility,LtpPageControl

    ASP.NET中常用的几个开源公共类: LTP.Common.dll: 通用函数类库     源码下载Maticsoft.DBUtility.dll 数据访问类库组件     源码下载LtpPageC ...