我想在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/>");
}
答案 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算法。这很容易理解,维基百科也有描述。