使用vector实现矩阵,并计算N阶矩阵的行列式
2008-07-19 14:10
429 查看
// ***************************************************************
// main version: 1.0 · date: 07/19/2008
// -------------------------------------------------------------
// 该程序使用递归的方法来求取N阶矩阵的行列式,其中矩阵使用vector
// 来表示,求取行列式的方法为代数余子式展开的方式
// -------------------------------------------------------------
// Copyright (C) 2008 - All Rights Reserved
// ***************************************************************
// Author: Wang Liuqiang
// E-Mail: wlq_729@163.com
// ***************************************************************
#include <iostream>
#include <vector>
using namespace std;
// 定义矩阵阶数
#define N 4
/************************************************************************/
/* 求取矩阵matrix的第i行第j列的代数余子式矩阵 */
/************************************************************************/
void GetSubMatrix(vector< vector<double> >& matrix, int i, int j)
{
vector< vector<double> >::iterator it1;
vector<double>::iterator it2;
int idx;
for (idx = 1, it1 = matrix.begin(); idx < i&&it1 != matrix.end(); idx++, it1++)
{
}
if (it1 == matrix.end())
{
cout<<"所给参数不合理!"<<endl;
return;
}
else
{
matrix.erase(it1);
}
for (it1 = matrix.begin(); it1 != matrix.end(); it1++)
{
for (idx = 1, it2 = it1->begin(); idx < j&&it2 != it1->end(); idx++, it2++)
{
}
if (it2 == it1->end())
{
cout<<"所给参数不合理!"<<endl;
return;
}
else
{
it1->erase(it2);
}
}
}
/************************************************************************/
/* 求取矩阵行列式,rank为矩阵的阶数 */
/************************************************************************/
double CalculateDetMatr(vector< vector<double> > matrix, int rank)
{
double DetValue = 0;
vector< vector<double> > temp;
if (rank == 1)
{
return matrix[0][0];
}
if (rank == 2)
{
DetValue = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
return DetValue;
}
else
{
int coe = 1;
// 每个矩阵都按第一行展开,所以下面的循环,当i为奇数时,奇数和
// 1相加为偶数所以系数为1;当i为偶数时,偶数加1为奇数系数为-1;
for (int i = 1; i <= rank; i++)
{
if (i % 2 != 0)
{
coe = 1;
}
else
{
coe = -1;
}
temp = matrix;
double temp2 = temp[0][i - 1]; // 保存系数
// 计算代数余子式矩阵
GetSubMatrix(temp, 1, i);
// 将每一步运算的代数余子式矩阵输出
cout<<"代数余子式为:"<<endl;
for (int k = 0; k < temp.size(); k++)
{
for (int j = 0; j < temp[k].size(); j++)
{
cout<<temp[k][j]<<" ";
}
cout<<endl;
}
DetValue += coe * temp2 * CalculateDetMatr(temp, rank - 1);
}
return DetValue;
}
}
void main()
{
int i, j, k;
vector< vector<double> > matrix;
vector<double> temp;
double value;
double Det;
// 输入矩阵
for (i = 0; i < N; i++)
{
temp.clear();
for (j =0; j < N; j++)
{
cin>>value;
temp.push_back(value);
}
matrix.push_back(temp);
}
// 输出矩阵
for (i = 0; i < matrix.size(); i++)
{
for (j = 0; j < matrix[i].size(); j++)
{
cout<<matrix[i][j]<<" ";
}
cout<<endl;
}
Det = CalculateDetMatr(matrix, N);
cout<<"矩阵行列式的值为:"<<endl;
cout<<Det<<endl;
}
// main version: 1.0 · date: 07/19/2008
// -------------------------------------------------------------
// 该程序使用递归的方法来求取N阶矩阵的行列式,其中矩阵使用vector
// 来表示,求取行列式的方法为代数余子式展开的方式
// -------------------------------------------------------------
// Copyright (C) 2008 - All Rights Reserved
// ***************************************************************
// Author: Wang Liuqiang
// E-Mail: wlq_729@163.com
// ***************************************************************
#include <iostream>
#include <vector>
using namespace std;
// 定义矩阵阶数
#define N 4
/************************************************************************/
/* 求取矩阵matrix的第i行第j列的代数余子式矩阵 */
/************************************************************************/
void GetSubMatrix(vector< vector<double> >& matrix, int i, int j)
{
vector< vector<double> >::iterator it1;
vector<double>::iterator it2;
int idx;
for (idx = 1, it1 = matrix.begin(); idx < i&&it1 != matrix.end(); idx++, it1++)
{
}
if (it1 == matrix.end())
{
cout<<"所给参数不合理!"<<endl;
return;
}
else
{
matrix.erase(it1);
}
for (it1 = matrix.begin(); it1 != matrix.end(); it1++)
{
for (idx = 1, it2 = it1->begin(); idx < j&&it2 != it1->end(); idx++, it2++)
{
}
if (it2 == it1->end())
{
cout<<"所给参数不合理!"<<endl;
return;
}
else
{
it1->erase(it2);
}
}
}
/************************************************************************/
/* 求取矩阵行列式,rank为矩阵的阶数 */
/************************************************************************/
double CalculateDetMatr(vector< vector<double> > matrix, int rank)
{
double DetValue = 0;
vector< vector<double> > temp;
if (rank == 1)
{
return matrix[0][0];
}
if (rank == 2)
{
DetValue = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
return DetValue;
}
else
{
int coe = 1;
// 每个矩阵都按第一行展开,所以下面的循环,当i为奇数时,奇数和
// 1相加为偶数所以系数为1;当i为偶数时,偶数加1为奇数系数为-1;
for (int i = 1; i <= rank; i++)
{
if (i % 2 != 0)
{
coe = 1;
}
else
{
coe = -1;
}
temp = matrix;
double temp2 = temp[0][i - 1]; // 保存系数
// 计算代数余子式矩阵
GetSubMatrix(temp, 1, i);
// 将每一步运算的代数余子式矩阵输出
cout<<"代数余子式为:"<<endl;
for (int k = 0; k < temp.size(); k++)
{
for (int j = 0; j < temp[k].size(); j++)
{
cout<<temp[k][j]<<" ";
}
cout<<endl;
}
DetValue += coe * temp2 * CalculateDetMatr(temp, rank - 1);
}
return DetValue;
}
}
void main()
{
int i, j, k;
vector< vector<double> > matrix;
vector<double> temp;
double value;
double Det;
// 输入矩阵
for (i = 0; i < N; i++)
{
temp.clear();
for (j =0; j < N; j++)
{
cin>>value;
temp.push_back(value);
}
matrix.push_back(temp);
}
// 输出矩阵
for (i = 0; i < matrix.size(); i++)
{
for (j = 0; j < matrix[i].size(); j++)
{
cout<<matrix[i][j]<<" ";
}
cout<<endl;
}
Det = CalculateDetMatr(matrix, N);
cout<<"矩阵行列式的值为:"<<endl;
cout<<Det<<endl;
}
相关文章推荐
- 使用vector实现矩阵,并计算N阶矩阵的行列式
- 朴素的矩阵行列式计算之C++实现
- c++实现4阶矩阵或行列式的计算
- 【原创】开源Math.NET基础数学类库使用(15)C#计算矩阵行列式
- NumPy中的乘法运算符 * 指示按元素计算,矩阵乘法可以使用 dot 函数或创建矩阵对象实现
- 开源Math.NET基础数学类库使用(15)C#计算矩阵行列式
- 【原创】开源Math.NET基础数学类库使用(15)C#计算矩阵行列式
- TensorFlow - 使用Eigen进行矩阵计算
- 矩阵的转置和行列式等操作的c语言实现
- 大数据IMF传奇行动绝密课程第97课:使用SparkStreaming+SparkSQL实现在线动态计算出特定时间窗口
- 使用SIFT和RANSAC算法,完成特征点的正确匹配,并求出变换矩阵,通过变换矩阵计算出要识别物体的边界
- MFC中双缓存机制的使用和实现,程序运行时间计算
- 给定一个字符串表达式s,计算其值(使用string和stack实现)
- 使用Olami SDK实现一个语音输入数字进行24点计算的iOS程序
- python实现矩阵求行列式的值
- 九度 OJ 1447 题 最短路径问题 Dijkstra(迪杰斯特拉)算法实现,使用vector模板模拟邻接链表
- 使用开源Grid平台-GridGain实现网格计算
- 使用开源Grid平台-GridGain实现网格计算
- 使用开源Grid平台-GridGain实现网格计算
- 关于android中使用weight属性实现多个layou比例布局的计算方法