2010-05-27 7 views
2

Comment calculer le déterminant d'une matrice NxN C#?Calcul d'un déterminant matriciel NxN en C#

+12

Est-ce que ce sont les devoirs? –

+3

La définition n'est-elle pas suffisante: http://en.wikipedia.org/wiki/Determinant? Lorsque vous avez essayé de l'implémenter sur C#, avez-vous rencontré des problèmes particuliers? –

+5

Donnez-nous le code que vous avez fait jusqu'à présent et nous vous aiderons. Mais nous ne le coderons pas pour vous. –

Répondre

3

Réduisez à la forme triangulaire supérieure, puis créez une boucle imbriquée où vous multipliez toutes les valeurs à la position i == j ensemble. Voilà.

+2

Il n'a même pas besoin d'être une boucle imbriquée, parce que si vous le faites pour les positions (i, j) où i == j vous pouvez le faire pour toutes les positions (i, i). – JAB

+0

Bon point, +1. – Brandi

+1

Le résultat que vous calculez peut être le négatif du déterminant. Vous devez prendre le produit de la diagonale primaire, puis multiplier par (-1)^[nombre de permutations de lignes utilisées pour obtenir la forme triangulaire supérieure] – Kevin

7

L'OP a posté another question demandant spécifiquement des matrices 4x4, qui a été fermé en tant que copie exacte de cette question. Eh bien, si vous n'êtes pas à la recherche d'une solution générale mais sont contraints à des matrices 4x4 seul, vous pouvez utiliser cette laide à la recherche, mais essayé et vrai code:

public double GetDeterminant() { 
    var m = _values; 
    return 
     m[12] * m[9] * m[6] * m[3] - m[8] * m[13] * m[6] * m[3] - 
     m[12] * m[5] * m[10] * m[3] + m[4] * m[13] * m[10] * m[3] + 
     m[8] * m[5] * m[14] * m[3] - m[4] * m[9] * m[14] * m[3] - 
     m[12] * m[9] * m[2] * m[7] + m[8] * m[13] * m[2] * m[7] + 
     m[12] * m[1] * m[10] * m[7] - m[0] * m[13] * m[10] * m[7] - 
     m[8] * m[1] * m[14] * m[7] + m[0] * m[9] * m[14] * m[7] + 
     m[12] * m[5] * m[2] * m[11] - m[4] * m[13] * m[2] * m[11] - 
     m[12] * m[1] * m[6] * m[11] + m[0] * m[13] * m[6] * m[11] + 
     m[4] * m[1] * m[14] * m[11] - m[0] * m[5] * m[14] * m[11] - 
     m[8] * m[5] * m[2] * m[15] + m[4] * m[9] * m[2] * m[15] + 
     m[8] * m[1] * m[6] * m[15] - m[0] * m[9] * m[6] * m[15] - 
     m[4] * m[1] * m[10] * m[15] + m[0] * m[5] * m[10] * m[15]; 
} 

Il suppose que vous stocker vos données vectorielles dans un réseau de 16 élément appelé _values (de double dans ce cas, mais float fonctionnerait aussi), dans l'ordre suivant:

0, 1, 2, 3, 
4, 5, 6, 7, 
8, 9, 10, 11, 
12, 13, 14, 15 
0

la méthode standard est LU decomposition. Vous pouvez utiliser une bibliothèque au lieu de la coder vous-même. Je ne sais pas sur C#, mais la norme de 40 ans est LAPACK.