自己在课程设计的时候捣鼓出来的n阶行列式的计算(目前只测到了第5阶),不过高阶的也应该没啥问题。。。
WW为已初始化过的二维的n行n列的行列式数组。
这里用vector数组是因为把整个的行列式计算写在了一个函数里,因为要接收降解后的行列式,所以用了动态数组。
AA为行列式的阶数 即为 n。
返回值为M(float)。
禁止在形参处使用引用,因为该迭代算法是将n阶的行列式最终拆分为2阶行列式,再逐阶带回上一层。
算法中的 i1 和 j1 只控制高一阶的行列式,i 和 j 辅助读取,在本算法的设计里只在读取完后自增
欢迎批评和指错。
float Calculation_2(std::vector<std::vector<float>>WW,int AA) //计算n阶行列式的值
{
float M = 0;
if(AA>2)
{
for (int J = 0; J < AA; J++) //J控制阶数
{
//创建一个临时的数组,存储降解后的行列式
std::vector<std::vector<float>> WW1(AA - 1, std::vector<float>(AA - 1, 0));
//i指控高一阶的行列式,i1指控低一阶的行列式,例如(i指控4阶,i1指控3阶)
for (int i = 0, i1 = 0; i < AA - 1; i1++)
{
if (i1 == i) continue; //i1!=i是为了读取低一阶的行列式(即代数余子式)
else
{
//将低一阶的行列式存储至临时数组
//i,j仍然能控制行和列,并辅助读取
for (int j = 0, j1 = 0; j < AA - 1; j1++)
{
if (j1 == J) continue;//j1!=J是为了读取已降阶的行列式(即代数余子式)
else
{
//存储余子式,用于后面的代数*余子式的计算
WW1[i][j] = WW[i1][j1];
}
j++;//复制完一列,自增
}
}
i++;//复制完一行,自增
}
M += (WW[0][J]) * (pow(-1, J + 2)) * Calculation_2(WW1, AA - 1);
}
}
else
{
return ((WW[0][0] * WW[1][1]) - (WW[0][1] * WW[1][0]));
}
return M;
}