我想在c#中找到4x4矩阵的行列式

时间:2010-05-30 05:58:33

标签: c#

  

可能重复:
  Calculating an NxN matrix determinant in C#

我想在c#

中找到4x4矩阵的行列式
    int ss = 4; int count = 0;
    int[,] matrix=new int[ss,ss];
    ArrayList al = new ArrayList() {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };
    for (int i = 0; i < ss; i++)
    {
        for (int j = 0; j < ss; j++)
        {
            matrix[i, j] =Convert.ToInt32( al[count]);
            ++count;
            Response.Write(matrix[i, j] + " ");
        }
        Response.Write("<br/>");
    }

4 个答案:

答案 0 :(得分:8)

如果你被固定为4x4,最简单的解决方案就是硬编码公式。

   // assumes matrix indices start from 0 (0,1,2 and 3)
   public double determinant(int[,] m) {
      return
         m[0,3] * m[1,2] * m[2,1] * m[3,0] - m[0,2] * m[1,3] * m[2,1] * m[3,0] -
         m[0,3] * m[1,1] * m[2,2] * m[3,0] + m[0,1] * m[1,3] * m[2,2] * m[3,0] +
         m[0,2] * m[1,1] * m[2,3] * m[3,0] - m[0,1] * m[1,2] * m[2,3] * m[3,0] -
         m[0,3] * m[1,2] * m[2,0] * m[3,1] + m[0,2] * m[1,3] * m[2,0] * m[3,1] +
         m[0,3] * m[1,0] * m[2,2] * m[3,1] - m[0,0] * m[1,3] * m[2,2] * m[3,1] -
         m[0,2] * m[1,0] * m[2,3] * m[3,1] + m[0,0] * m[1,2] * m[2,3] * m[3,1] +
         m[0,3] * m[1,1] * m[2,0] * m[3,2] - m[0,1] * m[1,3] * m[2,0] * m[3,2] -
         m[0,3] * m[1,0] * m[2,1] * m[3,2] + m[0,0] * m[1,3] * m[2,1] * m[3,2] +
         m[0,1] * m[1,0] * m[2,3] * m[3,2] - m[0,0] * m[1,1] * m[2,3] * m[3,2] -
         m[0,2] * m[1,1] * m[2,0] * m[3,3] + m[0,1] * m[1,2] * m[2,0] * m[3,3] +
         m[0,2] * m[1,0] * m[2,1] * m[3,3] - m[0,0] * m[1,2] * m[2,1] * m[3,3] -
         m[0,1] * m[1,0] * m[2,2] * m[3,3] + m[0,0] * m[1,1] * m[2,2] * m[3,3];
   }

参考

答案 1 :(得分:3)

考虑到您上次发布此完全相同的问题,您可能会看The Answer

答案 2 :(得分:2)

我不喜欢看别人的作业,所以相反我会总结一些关于你问题的想法,希望这比仅仅发布解决方案更具启发性。

之前你可能已经完成了3x3决定因素,并注意到该方法依赖于使用跨越行和列留下的各个2x2行列式。然后再乘以双交叉数字,+ / - 交替。

因此,对于4x4矩阵,您只需扩展此算法即可。这将要求您在越过col +行后找到剩余3x3矩阵的行列式。

基本上,你需要一个执行此操作的递归程序。

另外,听起来这个问题是更大的算法设计课程的一部分,你应该意识到这个算法不是很可扩展,即对于较大的矩阵,它需要大量的计算。

根据我的记忆,LU分解是一种很好的选择,它允许矩阵求逆具有良好的缩放特性。

答案 3 :(得分:2)

您需要的是LU分解的实现。

它将矩阵分解为两个三角矩阵L和U,使得A = L * U. L是下三角矩阵,U是上三角矩阵。

由于A = L * U,因此det(A)= det(L)* det(U)。现在,三角矩阵的行列式等于对角线上的乘积od元素的事实允许容易地计算det(L)和det(U)。

对于U

det(L)= diag_prod(L)相同

所以

det(A)= diag_prod(L)* diag_prod(U)

对于LU分解的实际算法我推荐Doolittle算法。这很容易理解,维基百科也有描述。

http://en.wikipedia.org/wiki/LU_decomposition