您的位置:首页 > 其它

使用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: