The determinant will be calculated using Laplace's formula:
| Laplace's formula for the determinant |
n - the size (order) of A
a - A's element at the position (i,j)
M - A's minor determined by i and j.
Example:
Let us assume that we have the following matrix:
| A sample 3x3 matrix |
![]() |
| The calculation of A's determinant |
Our function will receive as parameters a matrix and the order of the determinant. The function shall return a number who is the matrix's determinant according to the specified order. The order should represent in most cases the size of the matrix. You can also specify a smaller than size order to compute the determinant of a minor of the matrix.
The function's definition is:
/* * Description: * Computes the determinant of a given matrix * Parameters: * mat - a pointer to the matrix * order - usually the size of square matrix, but it can be used * if you want to compute a determinant of a minor * Returns: * The value of the determinant if the input is correct. * Otherwise returns NaN. * Preconditions: * @mat must not be NULL * @mat must be a square matrix * @column and @row must be smaller than @order * @order must be greater than 1 but smaller or equal when * compared to the size of the matrix */ real NMatrix_Determinant(const NMatrix *mat, integer order);The implementation of the function is:
real NMatrix_Determinant(const NMatrix *mat, integer order)
{
integer i = 0 ,j = 0 ,k = 0 ,l = 0;
real det = 0.0;
NMatrix *minor = NULL;
if((mat->rows == mat->columns) && (order>=1) && (order<=mat->rows))
{
if(order==1)
{
det = mat->data[0][0];
}
else if(order==2)
{
det = (mat->data[0][0] * mat->data[1][1]) -
(mat->data[0][1] * mat->data[1][0]);
}
else
{
for (k=0 ; k<order ; k++)
{
minor = NMatrix_Create(order,order);
for(i=1 ; i<order ; i++)
{
l = 0;
for (j=0;j<order;j++)
{
if (j != k)
{
minor->data[i-1][l] = mat->data[i][j];
l++;
}
}
}
det += pow(-1.0,k) * mat->data[0][k]
* NMatrix_Determinant(minor,order-1);
minor = NMatrix_Destroy(minor);
}
}
}
else
{
det = NAN;
}
return det;
}
Example:#include<stdio.h>
#include"NMatrix.h"
void PrintMatrix(NMatrix *mat)
{
integer i = 0, j = 0;
for (i = 0; i < mat->rows; i++)
{
for (j = 0; j < mat->columns; j++)
{
printf("%f ", mat->data[i][j]);
}
putchar('\n');
}
putchar('\n');
}
int main(int argc, char *argv[])
{
real det = 0;
NMatrix *mat = NULL;
/*Creates and initializes the matrix*/
mat = NMatrix_Create(3, 3);
mat->data[0][0]=-2;
mat->data[0][1]=2;
mat->data[0][2]=-3;
mat->data[1][0]=-1;
mat->data[1][1]=1;
mat->data[1][2]=3;
mat->data[2][0]=2;
mat->data[2][1]=0;
mat->data[2][2]=-1;
/*Prints the matrix*/
puts("Matrix: ");
PrintMatrix(mat);
/*Computes the determinant of the matrix*/
puts("Determinant of the matrix: ");
det = NMatrix_Determinant(mat, 3);
printf("%2.1f\n", det);
/*Computes the determinant of a minor*/
puts("Determinant of a minor (M33): ");
det = NMatrix_Determinant(mat, 2);
printf("%2.1f", det);
return 0;
}
/*:
Matrix:
-2.000000 2.000000 -3.000000
-1.000000 1.000000 3.000000
2.000000 0.000000 -1.000000
Determinant of the matrix:
18.0
Determinant of a minor (M33):
0.0
*/


What is this order value you mention, where does it come from, what does it mean, and how do you know it's value to input it?
ReplyDeleteHere's a link that explains the mathematical notions behind the order of a matrix:
Deletehttp://www.mathebook.net/dict/odict/omatrix.htm
To compute the determinant of a matrix, the matrix needs to be square, so the order can be specified by using only one parameter.
Also,the order needs to specified as a parameter because the function is recursive and it calculates the matrix's determinant by decomposing the given matrix into minors and calculating their determinants.
For example, if you have a 3x3 matrix and you want to calculate its determinant you will need to compute the determinants of the 2x2 minors of the given matrix.
In the future, I will probably improve the article and provide better mathematical insight, but in the meantime you can check up Wikipedia's entry on determinants and how a determinant can be calculated using decomposition:
http://en.wikipedia.org/wiki/Determinant
So, the main idea is if you have 3x3 matrix and want its determinant calculated you will call the function as:
myDet = NMatrix_Determinant(myMatrix,3)