00001 #ifndef SYNAPS_LINALG_USCHUR_H
00002 #define SYNAPS_LINALG_USCHUR_H
00003
00004 #include <synaps/init.h>
00005 #include <synaps/linalg/MATRIX.m>
00006 #include <synaps/base/Range.h>
00007 #include <synaps/linalg/MethodName.h>
00008
00009 __BEGIN_NAMESPACE_SYNAPS
00010
00011
00012
00019 template <class M> inline
00020 M USchur(M & m, int n)
00021 {
00022 M A = m(Range2d(0,n-1,0,n-1));
00023 M B=m(Range2d(0,n-1,n,m.nbcol()-1)),
00024 C=m(Range2d(n,m.nbrow()-1,0,n-1)),
00025 D=m(Range2d(n,m.nbrow()-1,n,m.nbcol()-1));
00026 using namespace MATRIX;
00027 solve(LU(),C.rep(),D.rep());
00028 B *= C;
00029 A -= B;
00030 return A;
00031 }
00032
00033
00034 __END_NAMESPACE_SYNAPS
00035
00036 #endif // SYNAPS_LINALG_USCHUR_H
00037