OpendTect  6.6
polynd.h
Go to the documentation of this file.
1 #pragma once
2 
3 /*@+
4 ________________________________________________________________________
5 
6  (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
7  Author: Kristofer Tingdahl
8  Date: 10-12-1999
9  RCS: $Id$
10 ________________________________________________________________________
11 
12 @$*/
13 
14 #include "linsolv.h"
15 #include "arrayndimpl.h"
16 #include "arrayndalgo.h"
17 
24 template <class T>
26 {
27 public:
28  PolynomialND( const ArrayNDInfo& );
29  ~PolynomialND( );
30 
31  bool fit( const ArrayND<T>& );
32 
33  void setCoeff( const int* pos, T val )
34  { coeffs(pos) = val; }
35 
36  T getCoeff( const int* pos ) const
37  { return coeffs.get( pos ); }
38 
39  T getValue( const TypeSet<float>& ) const;
40  T getValue3D( float x0, float x1, float x2 ) const;
41 
42 protected:
45 };
46 
47 
48 template <class T>
50  : coeffs( size_ )
51  , solver( 0 )
52 {}
53 
54 
55 template <class T>
57 { delete solver; }
58 
59 
60 template <class T> inline
62 {
63  ArrayNDIter coeffiter( coeffs.info() );
64 
65  const int ndim = coeffs.info().getNDim();
66 
67  T res = 0;
68 
69  do
70  {
71  float posproduct = 1;
72  for ( int idx=0; idx<ndim; idx++ )
73  posproduct *= Math::IntPowerOf( pos[idx], coeffiter[idx] );
74 
75  res += posproduct * coeffs.getND( coeffiter.getPos() );
76  } while ( coeffiter.next() );
77 
78  return res;
79 }
80 
81 template <class T> inline
82 T PolynomialND<T>::getValue3D( float p0, float p1, float p2 ) const
83 {
84  const ArrayNDInfo& size = coeffs.info();
85  if ( size.getNDim() != 3 || size.getTotalSz() != 64 )
86  {
87  TypeSet<float> pos( 3,0 );
88  pos[0] = p0; pos[1] = p1; pos[2] = p2;
89 
90  return getValue( pos );
91  }
92 
93  float p0_2 = p0 * p0; float p0_3 = p0_2 * p0;
94  float p1_2 = p1 * p1; float p1_3 = p1_2 * p1;
95  float p2_2 = p2 * p2; float p2_3 = p2_2 * p2;
96 
97  const float p0p1 = p0 * p1;
98  const float p0p1_2 = p0p1 * p1;
99  const float p0p1_3 = p0p1_2 * p1;
100  const float p0_2p1 = p0_2 * p1;
101  const float p0_2p1_2 = p0_2p1 * p1;
102  const float p0_2p1_3 = p0_2p1_2 * p1;
103  const float p0_3p1 = p0_3 * p1;
104  const float p0_3p1_2 = p0_3p1 * p1;
105  const float p0_3p1_3 = p0_3p1_2 * p1;
106 
107  const T* ptr = coeffs.getData();
108 
109  T res = ptr[0] +
110  ptr[1] * p2 +
111  ptr[2] * p2_2 +
112  ptr[3] * p2_3 +
113 
114  ptr[4] * p1 +
115  ptr[5] * p1 * p2 +
116  ptr[6] * p1 * p2_2 +
117  ptr[7] * p1 * p2_3 +
118 
119  ptr[8] * p1_2 +
120  ptr[9] * p1_2 * p2 +
121  ptr[10] * p1_2 * p2_2 +
122  ptr[11] * p1_2 * p2_3 +
123 
124  ptr[12] * p1_3 +
125  ptr[13] * p1_3 * p2 +
126  ptr[14] * p1_3 * p2_2 +
127  ptr[15] * p1_3 * p2_3 +
128 
129 
130  ptr[16] * p0 +
131  ptr[17] * p0 * p2 +
132  ptr[18] * p0 * p2_2 +
133  ptr[19] * p0 * p2_3 +
134 
135  ptr[20] * p0p1 +
136  ptr[21] * p0p1 * p2 +
137  ptr[22] * p0p1 * p2_2 +
138  ptr[23] * p0p1 * p2_3 +
139 
140  ptr[24] * p0p1_2 +
141  ptr[25] * p0p1_2 * p2 +
142  ptr[26] * p0p1_2 * p2_2 +
143  ptr[27] * p0p1_2 * p2_3 +
144 
145  ptr[28] * p0p1_3 +
146  ptr[29] * p0p1_3 * p2 +
147  ptr[30] * p0p1_3 * p2_2 +
148  ptr[31] * p0p1_3 * p2_3 +
149 
150 
151  ptr[32] * p0_2 +
152  ptr[33] * p0_2 * p2 +
153  ptr[34] * p0_2 * p2_2 +
154  ptr[35] * p0_2 * p2_3 +
155 
156  ptr[36] * p0_2p1 +
157  ptr[37] * p0_2p1 * p2 +
158  ptr[38] * p0_2p1 * p2_2 +
159  ptr[39] * p0_2p1 * p2_3 +
160 
161  ptr[40] * p0_2p1_2 +
162  ptr[41] * p0_2p1_2 * p2 +
163  ptr[42] * p0_2p1_2 * p2_2 +
164  ptr[43] * p0_2p1_2 * p2_3 +
165 
166  ptr[44] * p0_2p1_3 +
167  ptr[45] * p0_2p1_3 * p2 +
168  ptr[46] * p0_2p1_3 * p2_2 +
169  ptr[47] * p0_2p1_3 * p2_3 +
170 
171 
172 
173  ptr[48] * p0_3 +
174  ptr[49] * p0_3 * p2 +
175  ptr[50] * p0_3 * p2_2 +
176  ptr[51] * p0_3 * p2_3 +
177 
178  ptr[52] * p0_3p1 +
179  ptr[53] * p0_3p1 * p2 +
180  ptr[54] * p0_3p1 * p2_2 +
181  ptr[55] * p0_3p1 * p2_3 +
182 
183  ptr[56] * p0_3p1_2 +
184  ptr[57] * p0_3p1_2 * p2 +
185  ptr[58] * p0_3p1_2 * p2_2 +
186  ptr[59] * p0_3p1_2 * p2_3 +
187 
188  ptr[60] * p0_3p1_3 +
189  ptr[61] * p0_3p1_3 * p2 +
190  ptr[62] * p0_3p1_3 * p2_2 +
191  ptr[63] * p0_3p1_3 * p2_3;
192 
193  return res;
194 }
195 
196 
197 template<class T>
198 bool PolynomialND<T>::fit( const ArrayND<T>& input )
199 {
200  const int totalsz = mCast( int, input.info().getTotalSz() );
201 
202  if ( !solver || solver->size() != totalsz )
203  {
204  if ( solver ) delete solver;
205 
206  Array2DImpl<T> poscoeffs(totalsz,totalsz);
207 
208  ArrayNDIter positer( input.info() );
209  const int ndim = input.info().getNDim();
210  int row = 0;
211  do
212  {
213  int col = 0;
214  ArrayNDIter powiter( input.info() );
215 
216  do
217  {
218  int coeff = 1;
219  for ( int idx=0; idx<ndim; idx++ )
220  coeff *= Math::IntPowerOf( positer[idx], powiter[idx] );
221 
222  poscoeffs.set( row, col, (T)coeff );
223  col++;
224  } while ( powiter.next() );
225 
226  row++;
227  } while ( positer.next() );
228 
229  solver = new LinSolver<T>( poscoeffs );
230  if ( !solver->init() )
231  return false;
232  }
233 
234  solver->apply( input.getData(), coeffs.getData() );
235 
236  return true;
237 }
238 
arrayndalgo.h
PolynomialND::getCoeff
T getCoeff(const int *pos) const
Definition: polynd.h:36
ArrayNDInfo
Contains the information about the size of ArrayND, and in what order the data is stored (if accessab...
Definition: arrayndinfo.h:25
ArrayNDInfo::getTotalSz
virtual uint64_t getTotalSz() const
PolynomialND::setCoeff
void setCoeff(const int *pos, T val)
Definition: polynd.h:33
PolynomialND::getValue3D
T getValue3D(float x0, float x1, float x2) const
Definition: polynd.h:82
PolynomialND::~PolynomialND
~PolynomialND()
Definition: polynd.h:56
arrayndimpl.h
PolynomialND::fit
bool fit(const ArrayND< T > &)
Definition: polynd.h:198
Math::IntPowerOf
iT IntPowerOf(iT i, iPOW p)
Definition: math2.h:121
ArrayND::info
virtual const ArrayNDInfo & info() const =0
ArrayNDImpl
Definition: arrayndimpl.h:250
mClass
#define mClass(module)
Definition: commondefs.h:181
ArrayNDIter::getPos
const int * getPos() const
Definition: arraynd.h:220
ArrayNDIter
Iterates through all samples in an ArrayND.
Definition: arraynd.h:209
ArrayNDIter::next
bool next()
linsolv.h
mCast
#define mCast(tp, v)
Definition: commondefs.h:137
PolynomialND::getValue
T getValue(const TypeSet< float > &) const
Definition: polynd.h:61
Array2DImpl
Implementation of Array2D.
Definition: arrayndimpl.h:102
PolynomialND::PolynomialND
PolynomialND(const ArrayNDInfo &)
Definition: polynd.h:49
PolynomialND::solver
LinSolver< T > * solver
Definition: polynd.h:44
LinSolver
LinSolver - Solves linear systems of equations on the form A*x=B. A is a matrix of the size N*N,...
Definition: gridder2d.h:23
Array2DImpl::set
void set(int, int, T)
Definition: arrayndimpl.h:497
ArrayND
An ArrayND is an array with a given number of dimensions and a size.
Definition: arraynd.h:33
ArrayNDInfo::getNDim
virtual int getNDim() const =0
PolynomialND::coeffs
ArrayNDImpl< T > coeffs
Definition: polynd.h:43
PolynomialND
PolynomialND is a N-dimensional polynomial with arbitary orders in each dimension....
Definition: polynd.h:26
ArrayND::getData
const T * getData() const
Definition: arraynd.h:54
TypeSet< float >

Generated at for the OpendTect seismic interpretation project. Copyright (C): dGB Beheer B.V. 1995-2021