#include "ref.h"
|
|
float32_t ref_detrm(float32_t *pSrc, float32_t *temp, uint32_t size)
|
{
|
float32_t s = 1, det = 0;
|
int i, j, m, n, c;
|
|
if ( size == 1 )
|
{
|
return ( pSrc[ 0 ] );
|
}
|
else
|
{
|
det = 0;
|
|
for ( c = 0;c < size;c++ )
|
{
|
m = 0;
|
n = 0;
|
|
for ( i = 0;i < size;i++ )
|
{
|
for ( j = 0;j < size;j++ )
|
{
|
temp[ i*size + j ] = 0;
|
|
if ( i != 0 && j != c )
|
{
|
temp[ m*(size-1) + n ] = pSrc[ i*size + j ];
|
|
if ( n < ( size - 2 ) )
|
{
|
n++;
|
}
|
else
|
{
|
n = 0;
|
m++;
|
}
|
}
|
}
|
}
|
|
det += s * ( pSrc[ c ] * ref_detrm( temp, temp + size*size, size - 1 ) );
|
s = -s;
|
}
|
}
|
|
return ( det );
|
}
|
|
|
void ref_cofact(float32_t *pSrc, float32_t *pDst, float32_t *temp, uint32_t size)
|
{
|
int p, q, m, n, i, j;
|
|
if (size == 1)
|
{
|
pDst[0] = 1;
|
return;
|
}
|
|
for ( q = 0;q < size;q++ )
|
{
|
for ( p = 0;p < size;p++ )
|
{
|
m = 0;
|
n = 0;
|
|
for ( i = 0;i < size;i++ )
|
{
|
for ( j = 0;j < size;j++ )
|
{
|
temp[ i*size + j ] = 0;
|
|
if ( i != q && j != p )
|
{
|
temp[ m*(size-1) + n ] = pSrc[ i*size + j ];
|
|
if ( n < ( size - 2 ) )
|
{
|
n++;
|
}
|
else
|
{
|
n = 0;
|
m++;
|
}
|
}
|
}
|
}
|
|
pDst[ q*size + p ] = ref_pow( -1, q + p ) * ref_detrm( temp, temp + (size-1)*(size-1), size - 1 );
|
}
|
}
|
}
|
|
|
|
float64_t ref_detrm64(float64_t *pSrc, float64_t *temp, uint32_t size)
|
{
|
float64_t s = 1, det = 0;
|
int i, j, m, n, c;
|
|
if ( size == 1 )
|
{
|
return ( pSrc[ 0 ] );
|
}
|
else
|
{
|
det = 0;
|
|
for ( c = 0;c < size;c++ )
|
{
|
m = 0;
|
n = 0;
|
|
for ( i = 0;i < size;i++ )
|
{
|
for ( j = 0;j < size;j++ )
|
{
|
temp[ i*size + j ] = 0;
|
|
if ( i != 0 && j != c )
|
{
|
temp[ m*(size-1) + n ] = pSrc[ i*size + j ];
|
|
if ( n < ( size - 2 ) )
|
{
|
n++;
|
}
|
else
|
{
|
n = 0;
|
m++;
|
}
|
}
|
}
|
}
|
|
det += s * ( pSrc[ c ] * ref_detrm64( temp, temp + size*size, size - 1 ) );
|
s = -s;
|
}
|
}
|
|
return ( det );
|
}
|
|
|
void ref_cofact64(float64_t *pSrc, float64_t *pDst, float64_t *temp, uint32_t size)
|
{
|
int p, q, m, n, i, j;
|
|
if (size == 1)
|
{
|
pDst[0] = 1;
|
return;
|
}
|
|
for ( q = 0;q < size;q++ )
|
{
|
for ( p = 0;p < size;p++ )
|
{
|
m = 0;
|
n = 0;
|
|
for ( i = 0;i < size;i++ )
|
{
|
for ( j = 0;j < size;j++ )
|
{
|
temp[ i*size + j ] = 0;
|
|
if ( i != q && j != p )
|
{
|
temp[ m*(size-1) + n ] = pSrc[ i*size + j ];
|
|
if ( n < ( size - 2 ) )
|
{
|
n++;
|
}
|
else
|
{
|
n = 0;
|
m++;
|
}
|
}
|
}
|
}
|
|
pDst[ q*size + p ] = ref_pow( -1, q + p ) * ref_detrm64( temp, temp + (size-1)*(size-1), size - 1 );
|
}
|
}
|
}
|