\(\newcommand{\W}[1]{ \; #1 \; }\) \(\newcommand{\R}[1]{ {\rm #1} }\) \(\newcommand{\B}[1]{ {\bf #1} }\) \(\newcommand{\D}[2]{ \frac{\partial #1}{\partial #2} }\) \(\newcommand{\DD}[3]{ \frac{\partial^2 #1}{\partial #2 \partial #3} }\) \(\newcommand{\Dpow}[2]{ \frac{\partial^{#1}}{\partial {#2}^{#1}} }\) \(\newcommand{\dpow}[2]{ \frac{ {\rm d}^{#1}}{{\rm d}\, {#2}^{#1}} }\)
det_of_minor
Determinant of a Minor
Syntax
#
include <cppad/speed/det_of_minor.hpp>
d = det_of_minor
( a , m , n , r , c )
Inclusion
The template function det_of_minor
is defined in the CppAD
namespace by including
the file cppad/speed/det_of_minor.hpp
(relative to the CppAD distribution directory).
Purpose
This template function returns the determinant of a minor of the matrix \(A\) using expansion by minors. The elements of the \(n \times n\) minor \(M\) of the matrix \(A\) are defined, for \(i = 0 , \ldots , n-1\) and \(j = 0 , \ldots , n-1\), by
where the functions \(R(i)\) is defined by the argument r and \(C(j)\) is defined by the argument c .
This template function 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 (on the order of m factorial floating point operations and about 70 lines of source code including comments). This is not an efficient method for computing a determinant; for example, using an LU factorization would be better.
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\):
\(n = m\).
for \(i = 0 , \ldots , m-1\), \(r[i] = i+1\), and \(r[m] = 0\).
for \(j = 0 , \ldots , m-1\), \(c[j] = j+1\), and \(c[m] = 0\).
a
The argument a has prototype
const std::vector<
Scalar >& a
and is a vector with size \(m * m\) (see description of Scalar below). The elements of the \(m \times m\) matrix \(A\) are defined, for \(i = 0 , \ldots , m-1\) and \(j = 0 , \ldots , m-1\), by
m
The argument m has prototype
size_t
m
and is the number of rows (and columns) in the square matrix \(A\).
n
The argument n has prototype
size_t
n
and is the number of rows (and columns) in the square minor \(M\).
r
The argument r has prototype
std::vector<size_t>&
r
and is a vector with \(m + 1\) elements. This vector defines the function \(R(i)\) which specifies the rows of the minor \(M\). To be specific, the function \(R(i)\) for \(i = 0, \ldots , n-1\) is defined by
All the elements of r must have value
less than or equal m .
The elements of vector r are modified during the computation,
and restored to their original value before the return from
det_of_minor
.
c
The argument c has prototype
std::vector<size_t>&
c
and is a vector with \(m + 1\) elements This vector defines the function \(C(i)\) which specifies the rows of the minor \(M\). To be specific, the function \(C(i)\) for \(j = 0, \ldots , n-1\) is defined by
All the elements of c must have value
less than or equal m .
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 result d has prototype
Scalar d
and is equal to the determinant of the minor \(M\).
Scalar
If x and y are objects of type Scalar
and i is an object of type int
,
the Scalar must support the following operations:
Syntax |
Description |
Result Type |
Scalar x |
default constructor for Scalar object. |
|
x = i |
set value of x to current value of i |
|
x = y |
set value of x to current value of y |
|
x + y |
value of x plus y |
Scalar |
x |
value of x minus y |
Scalar |
x * y |
value of x times value of y |
Scalar |
Example
The file
det_of_minor.cpp
contains an example and test of det_of_minor.hpp
.
Source Code
The file det_of_minor.hpp contains the source for this template function.