1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
const double SMALL = 1.0E-30;
using matrix = vector< vector<double> >;
//======================================================================
double determinant( matrix A )
{
int n = A.size();
double det = 1;
// Row operations for i = 0, ,,,, n - 2 (n-1 not needed)
for ( int i = 0; i < n - 1; i++ )
{
// Partial pivot: find row r below with largest element in column i
int r = i;
double maxA = abs( A[i][i] );
for ( int k = i + 1; k < n; k++ )
{
double val = abs( A[k][i] );
if ( val > maxA )
{
r = k;
maxA = val;
}
}
if ( r != i )
{
for ( int j = i; j < n; j++ ) swap( A[i][j], A[r][j] );
det = -det;
}
// Row operations to make upper-triangular
double pivot = A[i][i];
if ( abs( pivot ) < SMALL ) return 0.0; // Singular matrix
for ( int r = i + 1; r < n; r++ ) // On lower rows
{
double multiple = A[r][i] / pivot; // Multiple of row i to clear element in ith column
for ( int j = i; j < n; j++ ) A[r][j] -= multiple * A[i][j];
}
det *= pivot; // Determinant is product of diagonal
}
det *= A[n-1][n-1];
return det;
}
//======================================================================
int main()
{
matrix A = { { -2, 2, -3 }, // From Wikipedia; determinant = 18
{ -1, 1, 3 },
{ 2, 0, -1 } };
matrix B = { { 1, 2, 3, 4, 5, 6 },
{ -2, 5, 5, 7, -1, 0 },
{ 1, 9, 10, 3, 0, 5 },
{ -1, 11, -2, 2, 1, 4 },
{ 0, 19, 10, 13, -1, 4 },
{ 2, 2, 4, 3, -3, -2 } };
cout << "det( A ) = " << determinant( A ) << '\n';
cout << "det( B ) = " << determinant( B ) << '\n';
}
//======================================================================
|