Developer documentation

linear_gramschmidt.hpp
Go to the documentation of this file.
1 /********************************************************************
2  * This file is part of the source code of the realroot library.
3  * Author(s): J.P. Pavone, GALAAD, INRIA
4  * $Id: gramschmidt.hpp,v 1.1 2005/07/11 10:03:55 jppavone Exp $
5  ********************************************************************/
6 #ifndef realroot_SOLVE_SBDSLV_LINEAR_GRAMSCHMIDT_HPP
7 #define realroot_SOLVE_SBDSLV_LINEAR_GRAMSCHMIDT_HPP
8 //--------------------------------------------------------------------
9 #include <assert.h>
10 //--------------------------------------------------------------------
11 namespace mmx {
12 //--------------------------------------------------------------------
13 namespace linear
14 {
15 
16  template<typename real_t>
17  bool gramschmidt( real_t * M, unsigned m, unsigned n )
18  {
19  unsigned i,j,k;
20  assert(m<=n);
21  for ( i = 0; i < m; i ++ )
22  {
23  real_t s = 0.0;
24  for ( k = 0; k < n; k ++ )
25  s += M[i*n+k]*M[i*n+k];
26  if ( s < numerics::epsilon<real_t>::result ) return false;
27  for ( j = i+1; j < m; j ++ )
28  {
29  real_t d = 0.0;
30  for ( k = 0; k < n; k ++ )
31  d += M[i*n+k]*M[j*n+k];
32  d /= s;
33  for ( k = 0; k < n; k ++ )
34  M[j*n+k] -= d*M[i*n+k];
35  };
36  };
37  return true;
38  };
39 
40  /* on suppose que M admet un noyau de dimension 1
41  * ( et puis c tout !)
42  */
43 
44  template<typename real_t>
45  void library( real_t * M, unsigned n, real_t * v )
46  {
47 
48  //int m = n;
49  int goods[n];
50  int c = 0;
51  int i,j,k,p;
52  //int already =0;
53  real_t sc[ n ];
54 
55  c = 0;
56  for ( i = 0; i < n; i ++ )
57  {
58  real_t s = 0.0;
59  for ( k = 0; k < n; s += M[i*n+k]*M[i*n+k], k ++ ) ;
60  if ( s < numerics::epsilon<real_t>::result ) continue;
61  goods[c++] = i;
62  for ( j = i+1; j < n; j ++ )
63  {
64  real_t d = 0.0;
65  for ( k = 0; k < n; k ++ )
66  d += M[i*n+k]*M[j*n+k];
67  d /= s;
68  for ( k = 0; k < n; k ++ )
69  M[j*n+k] -= d*M[i*n+k];
70  };
71  sc[i] = s;
72  };
73  if ( c == n ) return;
74  k = 0;
75  while( k < c && goods[k] == k ) k ++;
76  while ( k < c )
77  {
78  std::copy( M + goods[k]*n, M + (goods[k]+1)*n,
79  M + k );
80  sc[k] = sc[goods[k]];
81  k++;
82  };
83  // vctops::print(goods,c);
84  // std::cout << std::endl;
85  // vctops::print(M,n);
86  // std::cout << std::endl;
87  // vctops::print(M+n,n);
88  // std::cout << std::endl;
89  // std::cout << "c = " << c << std::endl;
90  // std::cout << "n = " << n << std::endl;
91  for ( i = c; i < n; i ++ )
92  for ( k = 0; k < n; k ++ )
93  M[i*n+k] = ((real_t)rand())/((real_t)RAND_MAX);
94  // vctops::print(M+c*n,n);
95  // std::cout << std::endl;
96  for ( i = c; i < n; i ++ )
97  {
98  for ( p = i-1; p >= 0; p-- )
99  {
100  // std::cout << sc[p] << std::endl;
101  real_t d = 0.0;
102  for ( k = 0; k < n; k ++ )
103  d += M[p*n+k]*M[i*n+k];
104  d /= sc[p];
105  for ( k = 0; k < n; k ++ )
106  {
107  // std::cout << M[i*n+k] << std::endl;
108  M[i*n+k] -= d*M[p*n+k];
109  // std::cout << M[i*n+k] << std::endl;
110  };
111  };
112  real_t s = 0.0;
113  for ( k = 0; k < n; k ++ )
114  s += M[i*n+k]*M[i*n+k];
115  sc[i] = s;
116  };
117  };
118 
119 
120 };
121 //--------------------------------------------------------------------
122 } //namespace mmx
123 /********************************************************************/
124 #endif //
Definition: system_epsilon.hpp:19
void library(real_t *M, unsigned n, real_t *v)
Definition: linear_gramschmidt.hpp:45
bool gramschmidt(real_t *M, unsigned m, unsigned n)
Definition: linear_gramschmidt.hpp:17
TMPL void copy(Polynomial &r, const Polynomial &a)
Copy of a in r.
Definition: sparse_monomials.hpp:613
const C & c
Definition: Interval_glue.hpp:45
Definition: array.hpp:12
#define assert(expr, msg)
Definition: shared_object.hpp:57
Home