计算N阶行列式

根据N阶行列式计算公式:

∑ j 1 , j 2... , j n ( − 1 ) τ ( j 1 j 2 . . . j n ) a 1 j 1 a 2 j 2 . . . a n j n \displaystyle\sum_{j1,j2...,jn} (-1)^{\tau(j_1j_2...j_n)}a_{1j_1} a_{2j_2} ...a_{nj_n} j1,j2...,jn(1)τ(j1j2...jn)a1j1a2j2...anjn

j1,j2,…,jn进行全排列并且计算出他们的反序数,通过循环将各项累加即可

#include <cmath>
#include <algorithm>
#include <vector>
/*计算行列式
data:行列式的所有数据
n:行列式的阶数*/
double CalcDet(double *data, int n)
{
	std::vector<int> order;//序列的顺序
	double sum = 0;//累加的结果
	auto GetNum=[](std::vector<int> &a)
	{
		int n = a.size() - 1;//最后一个数不用管
		int sum = 0;
		for (int i = 0; i < n; ++i)
			for (int j = i + 1; j <= n; ++j)
					++sum;
		return sum;
	};//获取反序列数目的lambda表达式

	//初始化序列
	for (int i = 0; i < n; ++i)
		order.push_back(i);

	do{
		double mul = 1.0;
		for (int i = 0; i < n; ++i)
			mul *= data[i + order[i] * n];
		sum += pow(-1, GetNum(order))*mul;
	} while (std::next_permutation(order.begin(), order.end()));

	return sum;
}

测试代码:

#include <iostream>
using namespace std;
int main()
{
	double *data;
	int n;

	cout << "请输入阶数:";
	cin >> n;

	data = new double[n*n];

	cout << "请输入数据(空格或者换行隔开)" << endl;
	for (int i = 0; i < n*n; ++i)
		cin >> data[i];

	cout << "计算结果为:" << CalcDet(data, n) << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫空-NS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值