cpp_det_of_minor

View page source

C++ Determinant of a Minor

Syntax

      # include <cmpad/algo/det_of_minor.hpp>
      d = cmpad::det_of_minor ( a , n , m , r , c )

Prototype

template <class Vector>
typename Vector::value_type det_of_minor(
   const Vector&                   a  ,
   size_t                          n  ,
   size_t                          m  ,
   cmpad::vector<size_t>&          r  ,
   cmpad::vector<size_t>&          c  )
{  assert( a.size() == n * n );
   assert( r.size() == n + 1 );
   assert( c.size() == n + 1 );

Purpose

This template function computes the determinant of a minor of the matrix \(A\) using expansion by minors. It is for example and testing purposes only. Expansion by minors is chosen as an example because it uses a lot of floating point operations yet does not require much source code. This is not an efficient method for computing a determinant; for example, using an LU factorization would be faster.

Minor

The elements of the \(m \times m\) minor \(M\) of the matrix \(A\) are defined, for \(i = 0 , \ldots , m-1\) and \(j = 0 , \ldots , m-1\), by

\[M_{i,j} = A_{R(i), C(j)}\]

where the function \(R(i)\) is defined by the argument r and \(C(j)\) is defined by the argument c .

Determinant of A

If the following conditions hold, the minor is the entire matrix \(A\) and hence det_of_minor will return the determinant of \(A\):

  1. \(m = n\).

  2. for \(i = 0 , \ldots , n-1\), \(r[i] = i+1\), and \(r[n] = 0\).

  3. for \(j = 0 , \ldots , n-1\), \(c[j] = j+1\), and \(c[n] = 0\).

Vector

This type satisfies the conditions for a fun_obj Vector .

a

The elements of the \(n \times n\) matrix \(A\) are defined, for \(i = 0 , \ldots , n-1\) and \(j = 0 , \ldots , n-1\), by

\[A_{i,j} = a[ i * n + j]\]

n

This is the number of rows (and columns) in the square matrix \(A\).

m

This is the number of rows (and columns) in the square minor \(M\).

r

This defines the function \(R(i)\) which specifies the rows of the minor \(M\). To be specific, the function \(R(i)\) for \(i = 1, \ldots , m-1\) is defined by

\[\begin{split}\begin{eqnarray} R(0) & = & r[n] \\ R(i) & = & r[ R(i-1) ] \end{eqnarray}\end{split}\]

All the elements of r have value less than or equal n ; \(R(i) < n\) and \(r[ R(m-1) ] = n\) . The elements of vector r are modified during the computation, and restored to their original value before the return from det_of_minor .

c

This defines the function \(C(i)\) which specifies the columns of the minor \(M\). To be specific, the function \(C(i)\) for \(j = 1, \ldots , m-1\) is defined by

\[\begin{split}\begin{eqnarray} C(0) & = & c[n] \\ C(j) & = & c[ C(j-1) ] \end{eqnarray}\end{split}\]

All the elements of c must have value less than or equal n ; \(C(j) < n\) and \(c[ C(m-1) ] = n\) . The elements of vector c are modified during the computation, and restored to their original value before the return from det_of_minor .

d

The return value d is equal to the determinant of the minor \(M\) and has the same type as the elements of a.

Name

Title

det_of_minor.hpp

det_of_minor: Source Code

xam_det_of_minor.cpp

C++ Example and Test of det_of_minor

Example

xam_det_of_minor.cpp contains an example and test of det_of_minor .