c代码 n阶行列式的计算

自己在课程设计的时候捣鼓出来的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;
}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值