|
inlib
1.2.0
|


Public Member Functions | |
| sqm (unsigned a_order) | |
| virtual | ~sqm () |
| sqm (const sqm &a_from) | |
| sqm & | operator= (const sqm &a_from) |
| bool | set_order (unsigned int a_order) |
| unsigned int | order () const |
| T | value (unsigned int aR, unsigned int aC) const |
| bool | value (unsigned int aR, unsigned int aC, T &a_value) const |
| bool | set_value (unsigned int aR, unsigned int aC, const T &a_value) |
| void | set_value_no_check (unsigned int aR, unsigned int aC, const T &a_value) |
| T | trace () const |
| bool | mx_mul (const sqm< T > &a_matrix, sqm< T > &a_result) const |
| bool | mx_mul (const sqm< T > &a_matrix) |
| bool | mx_left_mul (const sqm< T > &a_matrix, sqm< T > &a_result) const |
| bool | mx_left_mul (const sqm< T > &a_matrix) |
| virtual T | determinant () const |
| T | sub_determinant (const std::vector< unsigned int > &aRs, const std::vector< unsigned int > &aCs) const |
| bool | invert (sqm< T > &a_result) const |
| void | transpose () |
| bool | is_symmetric () const |
| bool | is_antisymmetric () const |
| void | set_identity () |
| void | set_diag (const T &a_value) |
| sqm | symmetric_part () const |
| sqm | antisymmetric_part () const |
| sqm & | operator*= (const sqm< T > &a_from) |
| sqm & | operator+= (const sqm< T > &a_from) |
| sqm & | operator-= (const sqm< T > &a_from) |
| inlib::sqm< T >::sqm | ( | unsigned | a_order | ) | [inline] |
| virtual inlib::sqm< T >::~sqm | ( | ) | [inline, virtual] |
Reimplemented in inlib::a3::sqm< T >, inlib::a3::sqm< double >, inlib::a4::sqm< T >, inlib::a4::sqm< double >, inlib::a4::sqm< float >, inlib::a4::sqm< std::complex< double > >, inlib::a2::sqm< T >, inlib::a2::sqm< double >, and inlib::a2::sqm< std::complex< double > >.
Definition at line 20 of file sqm.
{}
| inlib::sqm< T >::sqm | ( | const sqm< T > & | a_from | ) | [inline] |
Reimplemented in inlib::a3::sqm< double >, inlib::a4::sqm< double >, inlib::a4::sqm< float >, inlib::a4::sqm< std::complex< double > >, inlib::a2::sqm< double >, and inlib::a2::sqm< std::complex< double > >.
Definition at line 22 of file sqm.
:array<T>(a_from){}
| sqm inlib::sqm< T >::antisymmetric_part | ( | ) | const [inline] |
| virtual T inlib::sqm< T >::determinant | ( | ) | const [inline, virtual] |
Reimplemented in inlib::a3::sqm< T >, inlib::a3::sqm< double >, inlib::a4::sqm< T >, inlib::a4::sqm< double >, inlib::a4::sqm< float >, inlib::a4::sqm< std::complex< double > >, inlib::a2::sqm< T >, inlib::a2::sqm< double >, and inlib::a2::sqm< std::complex< double > >.
Definition at line 134 of file sqm.
{
unsigned int ord = order();
if(ord==0) return array<T>::zero();
else if(ord==1) return value(0,0);
else if(ord==2) return (value(0,0) * value(1,1) -
value(1,0) * value(0,1)); //Optimize
unsigned int rord = ord-1;
std::vector<unsigned int> cs(rord);
std::vector<unsigned int> rs(rord);
T det = array<T>::zero();
{for(unsigned int i=0;i<rord;i++) {cs[i] = i+1;}}
unsigned int c = 0;
//if(c>=1) cs[c-1] = c-1;
{for(unsigned int i=0;i<rord;i++) {rs[i] = i+1;}}
bool sg = true; //c=0+r=0
for(unsigned int r=0;r<ord;r++) {
if(r>=1) rs[r-1] = r-1;
T subdet = sub_determinant(rs,cs);
if(sg)
det += value(r,c) * subdet;
else
det -= value(r,c) * subdet;
sg = sg?false:true;
}
return det;
}
| bool inlib::sqm< T >::invert | ( | sqm< T > & | a_result | ) | const [inline] |
Reimplemented in inlib::a4::sqm< double >, inlib::a4::sqm< float >, inlib::a4::sqm< std::complex< double > >, and inlib::a3::sqm< double >.
Definition at line 211 of file sqm.
{
//Generic invertion method.
unsigned int ord = order();
if(ord==0) return true;
a_result.set_order(ord);
if(ord==1) {
T v;
if(!value(0,0,v)) return false;
if(v==array<T>::zero()) return false;
if(!a_result.set_value(0,0,1./v)) return false;
return true;
}
unsigned int rord = ord-1;
std::vector<unsigned int> cs(rord);
std::vector<unsigned int> rs(rord);
// Get det with r = 0;
T det = array<T>::zero();
{
{for(unsigned int i=0;i<rord;i++) {rs[i] = i+1;}}
unsigned int r = 0;
//if(r>=1) rs[r-1] = r-1;
{for(unsigned int i=0;i<rord;i++) {cs[i] = i+1;}}
bool sg = true; //r=0+c=0
for(unsigned int c=0;c<ord;c++) {
if(c>=1) cs[c-1] = c-1;
T subdet = sub_determinant(rs,cs);
T sgn = sg ? array<T>::one() : array<T>::minus_one();
det += value(r,c) * subdet * sgn;
T value = subdet * sgn;
a_result.set_value_no_check(c,r,value);
sg = sg?false:true;
}}
if(det==array<T>::zero()) return false;
{for(unsigned int c=0;c<ord;c++) {
a_result.set_value(c,0,a_result.value(c,0)/det);
}}
{for(unsigned int i=0;i<rord;i++) {rs[i] = i+1;}}
bool sgr = false; //r=1+c=0
for(unsigned int r=1;r<ord;r++) {
if(r>=1) rs[r-1] = r-1;
{for(unsigned int i=0;i<rord;i++) {cs[i] = i+1;}}
bool sg = sgr;
for(unsigned int c=0;c<ord;c++) {
if(c>=1) cs[c-1] = c-1;
T subdet = sub_determinant(rs,cs);
T sgn = sg ? array<T>::one() : array<T>::minus_one();
T value = (subdet * sgn)/det;
a_result.set_value_no_check(c,r,value);
sg = sg?false:true;
}
sgr = sgr?false:true;
}
return true;
}
| bool inlib::sqm< T >::is_antisymmetric | ( | ) | const [inline] |
| bool inlib::sqm< T >::is_symmetric | ( | ) | const [inline] |
| bool inlib::sqm< T >::mx_left_mul | ( | const sqm< T > & | a_matrix, |
| sqm< T > & | a_result | ||
| ) | const [inline] |
Definition at line 103 of file sqm.
{
// a_result = a_matrix * this
unsigned int ord = order();
if(a_matrix.order()!=ord) return false;
if(a_result.order()!=ord) return false;
const T* p = &(array<T>::m_vector[0]); //WARNING : dangerous.
const T* a_p = &(a_matrix.array<T>::m_vector[0]); //WARNING : dangerous.
T* r_p = &(a_result.array<T>::m_vector[0]); //WARNING : dangerous.
for(unsigned int r=0;r<ord;r++) {
for(unsigned int c=0;c<ord;c++) {
T value = array<T>::zero();
for(unsigned int i=0;i<ord;i++) {
//value +=
// a_matrix.array<T>::m_vector[r+i*ord] *
// array<T>::m_vector[i+c*ord];
value += (*(a_p+r+i*ord)) * (*(p+i+c*ord)); //optimize.
}
//a_result.array<T>::m_vector[r+c*ord] = value;
*(r_p+r+c*ord) = value;
}
}
return true;
}
| bool inlib::sqm< T >::mx_left_mul | ( | const sqm< T > & | a_matrix | ) | [inline] |
Definition at line 127 of file sqm.
{
sqm<T> res(order());
bool status = this->mx_left_mul(a_matrix,res);
*this = res;
return status;
}
| bool inlib::sqm< T >::mx_mul | ( | const sqm< T > & | a_matrix, |
| sqm< T > & | a_result | ||
| ) | const [inline] |
Definition at line 72 of file sqm.
{
// a_result = this * a_matrix
unsigned int ord = order();
if(a_matrix.order()!=ord) return false;
if(a_result.order()!=ord) return false;
const T* p = &(array<T>::m_vector[0]); //WARNING : dangerous.
const T* a_p = &(a_matrix.array<T>::m_vector[0]); //WARNING : dangerous.
T* r_p = &(a_result.array<T>::m_vector[0]); //WARNING : dangerous.
for(unsigned int r=0;r<ord;r++) {
for(unsigned int c=0;c<ord;c++) {
T value = array<T>::zero();
for(unsigned int i=0;i<ord;i++) {
//value +=
// array<T>::m_vector[r+i*ord] *
// a_matrix.array<T>::m_vector[i+c*ord];
value += (*(p+r+i*ord)) * (*(a_p+i+c*ord)); //optimize.
}
//a_result.array<T>::m_vector[r+c*ord] = value;
*(r_p+r+c*ord) = value;
}
}
return true;
}
| bool inlib::sqm< T >::mx_mul | ( | const sqm< T > & | a_matrix | ) | [inline] |
| sqm& inlib::sqm< T >::operator*= | ( | const sqm< T > & | a_from | ) | [inline] |
| sqm& inlib::sqm< T >::operator+= | ( | const sqm< T > & | a_from | ) | [inline] |
Definition at line 343 of file sqm.
{
/*bool status =*/ array<T>::add(a_from); //FIXME : throw
return *this;
}
| sqm& inlib::sqm< T >::operator-= | ( | const sqm< T > & | a_from | ) | [inline] |
Definition at line 347 of file sqm.
{
/*bool status =*/ array<T>::subtract(a_from); //FIXME : throw
return *this;
}
| sqm& inlib::sqm< T >::operator= | ( | const sqm< T > & | a_from | ) | [inline] |
Reimplemented in inlib::a3::sqm< double >, inlib::a4::sqm< double >, inlib::a4::sqm< float >, inlib::a4::sqm< std::complex< double > >, inlib::a2::sqm< double >, and inlib::a2::sqm< std::complex< double > >.
Definition at line 23 of file sqm.
{
array<T>::operator=(a_from);
return *this;
}
| unsigned int inlib::sqm< T >::order | ( | ) | const [inline] |
| void inlib::sqm< T >::set_diag | ( | const T & | a_value | ) | [inline] |
Definition at line 314 of file sqm.
{
unsigned int ord = order();
for(unsigned int c=0;c<ord;c++) set_value_no_check(c,c,a_value);
}
| void inlib::sqm< T >::set_identity | ( | ) | [inline] |
Definition at line 308 of file sqm.
{
unsigned int ord = order();
array<T>::reset();
for(unsigned int c=0;c<ord;c++) set_value_no_check(c,c,array<T>::one());
}
| bool inlib::sqm< T >::set_order | ( | unsigned int | a_order | ) | [inline] |
| bool inlib::sqm< T >::set_value | ( | unsigned int | aR, |
| unsigned int | aC, | ||
| const T & | a_value | ||
| ) | [inline] |
| void inlib::sqm< T >::set_value_no_check | ( | unsigned int | aR, |
| unsigned int | aC, | ||
| const T & | a_value | ||
| ) | [inline] |
| T inlib::sqm< T >::sub_determinant | ( | const std::vector< unsigned int > & | aRs, |
| const std::vector< unsigned int > & | aCs | ||
| ) | const [inline] |
Definition at line 164 of file sqm.
{
//WARNING : to optimize, we do not check the content of aRs, aCs.
unsigned int ord = aRs.size();
if(ord==0) return array<T>::zero();
else if(ord==1) return value(aRs[0],aCs[0]);
else if(ord==2) {
//return (value(aRs[0],aCs[0]) * value(aRs[1],aCs[1]) -
// value(aRs[1],aCs[0]) * value(aRs[0],aCs[1]));
//Optimize the upper :
unsigned int r_0 = aRs[0];
unsigned int r_1 = aRs[1];
unsigned int c_0 = aCs[0];
unsigned int c_1 = aCs[1];
unsigned int ord = order();
const T* p = &(array<T>::m_vector[0]); //WARNING : dangerous.
return ( (*(p+r_0+c_0*ord)) * (*(p+r_1+c_1*ord)) -
(*(p+r_1+c_0*ord)) * (*(p+r_0+c_1*ord)) );
}
unsigned int rord = ord-1;
std::vector<unsigned int> cs(rord);
std::vector<unsigned int> rs(rord);
T det = array<T>::zero();
{for(unsigned int i=0;i<rord;i++) {cs[i] = aCs[i+1];}}
unsigned int c = 0;
//if(c>=1) cs[c-1] = c-1;
{for(unsigned int i=0;i<rord;i++) {rs[i] = aRs[i+1];}}
bool sg = true; //c=0+r=0
for(unsigned int r=0;r<ord;r++) {
if(r>=1) rs[r-1] = aRs[r-1];
T subdet = sub_determinant(rs,cs);
if(sg)
det += value(aRs[r],aCs[c]) * subdet;
else
det -= value(aRs[r],aCs[c]) * subdet;
sg = sg?false:true;
}
return det;
}
| sqm inlib::sqm< T >::symmetric_part | ( | ) | const [inline] |
| T inlib::sqm< T >::trace | ( | ) | const [inline] |
| void inlib::sqm< T >::transpose | ( | ) | [inline] |
Definition at line 274 of file sqm.
{
unsigned int ord = order();
for(unsigned int r=0;r<ord;r++) {
for(unsigned int c=(r+1);c<ord;c++) {
T vrc = value(r,c);
T vcr = value(c,r);
set_value_no_check(r,c,vcr);
set_value_no_check(c,r,vrc);
}
}
}
| T inlib::sqm< T >::value | ( | unsigned int | aR, |
| unsigned int | aC | ||
| ) | const [inline] |
| bool inlib::sqm< T >::value | ( | unsigned int | aR, |
| unsigned int | aC, | ||
| T & | a_value | ||
| ) | const [inline] |
Definition at line 42 of file sqm.
{
unsigned int ord = order();
if((aR>=ord)||(aC>=ord)) {
a_value = array<T>::zero();
return false;
}
a_value = array<T>::m_vector[aR + aC * ord];
return true;
}
1.7.5.1