OpendTect  6.3
array2dmatrix.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: Bert
8  Date: Apr 2014
9 ________________________________________________________________________
10 
11 
12 @$*/
13 
14 #include "algomod.h"
15 #include "arrayndimpl.h"
16 #include "math2.h"
17 
18 
20 
29 template <class fT>
31 {
32 public:
33  Array2DMatrix( int sz0=1, int sz1=0 )
34  : a2d_(sz0<1?1:sz0,
35  sz1<1?(sz0<1?1:sz0):sz1) { setAll(); }
36  Array2DMatrix( const Array2DMatrix& oth )
37  : a2d_(oth.a2d_) {}
39  : a2d_(a2d) {}
40  Array2DMatrix( const Array2D<fT>& a2d )
41  : a2d_(a2d) {}
42  inline Array2DMatrix& operator =( const Array2DMatrix& oth )
43  { return a2d_ = oth.a2d_; }
44  inline Array2DMatrix& operator =( const Array2DImpl<fT>& a2d )
45  { return a2d_ = a2d; }
46  inline Array2DMatrix& operator =( const Array2D<fT>& a2d )
47  { return a2d_ = a2d; }
48  inline bool operator ==( const Array2DMatrix<fT>& oth ) const
49  { return isEq( oth.a2d_, fT(1e-6)) ; }
50  inline bool isEq(const Array2D<fT>&,fT eps=fT(1e-6)) const;
51 
52  inline int size(bool dim1=false) const;
53  inline void set( int i0, int i1, fT v ) { a2d_.set(i0,i1,v); }
54  inline fT& get(int i0,int i1);
55  inline fT get( int i0, int i1 ) const { return a2d_.get(i0,i1); }
56 
57  inline void setAll( fT v=fT(0) ) { a2d_.setAll( v ); }
58  inline void setDiagonal(fT);
59  inline void setToIdentity() { setAll(0); setDiagonal(1); }
60 
61  inline void add(fT);
62  inline void add(const Array2DMatrix&);
63  inline void multiply(fT);
64  inline void multiply(const Array2DMatrix&);
65  inline void transpose();
66 
67  inline void getSum(const Array2DMatrix&,Array2DMatrix&) const;
68  inline void getProduct(const Array1DVector&,Array1DVector&) const;
69  inline void getProduct(const Array2DMatrix&,Array2DMatrix&) const;
70  inline void getTransposed(Array2DMatrix&);
71  inline bool getCholesky(Array2DMatrix&) const;
72 
74 
75 };
76 
77 
79 #define mDefineA2DMatSizes(m,nm) \
80  const int nm##0 = (m).size( false ); const int nm##1 = (m).size( true )
81 
82 
83 template <class fT>
84 inline int Array2DMatrix<fT>::size( bool dim1 ) const
85 {
86  return a2d_.info().getSize( dim1 ? 1 : 0 );
87 }
88 
89 
90 template <class fT>
91 inline fT& Array2DMatrix<fT>::get( int i0, int i1 )
92 {
93  const od_int64 offset = a2d_.info().getOffset( i0, i1 );
94  return a2d_.getData()[offset];
95 }
96 
97 
98 #define mDefineImplA2DMatSizes mDefineA2DMatSizes(*this,sz)
99 
100 
101 template <class fT>
102 inline bool Array2DMatrix<fT>::isEq( const Array2D<fT>& a2d, fT eps ) const
103 {
105  if ( a2d_.info().getSize(0) != sz0 || a2d_.info().getSize(1) != sz1 )
106  return false;
107 
108  for ( int idx0=0; idx0<sz0; idx0++ )
109  {
110  for ( int idx1=0; idx1<sz1; idx1++ )
111  {
112  if ( !isFPEqual( get(idx0,idx1), a2d.get(idx0,idx1), eps ) )
113  return false;
114  }
115  }
116  return true;
117 }
118 
119 
120 template <class fT>
122 {
124  const int sz = sz0 > sz1 ? sz1 : sz0;
125 
126  for ( int idx=0; idx<sz; idx++ )
127  set( idx, idx, v );
128 }
129 
130 
131 template <class fT>
132 inline void Array2DMatrix<fT>::add( fT val )
133 {
135  for ( int idx0=0; idx0<sz0; idx0++ )
136  for ( int idx1=0; idx1<sz1; idx1++ )
137  get( idx0, idx1 ) += val;
138 }
139 
140 
141 template <class fT>
142 inline void Array2DMatrix<fT>::add( const Array2DMatrix& in )
143 {
145  mDefineA2DMatSizes( in, insz );
146  const int outsz0 = insz0 > sz0 ? sz0 : insz0;
147  const int outsz1 = insz1 > sz1 ? sz1 : insz1;
148 
149  for ( int idx0=0; idx0<outsz0; idx0++ )
150  {
151  for ( int idx1=0; idx1<outsz1; idx1++ )
152  {
153  fT res = 0;
154  for ( int idx=0; idx<sz1; idx++ )
155  get( idx0, idx1 ) += in.get( idx0, idx1 );
156  }
157  }
158 }
159 
160 
161 template <class fT>
162 inline void Array2DMatrix<fT>::multiply( fT fac )
163 {
165  for ( int idx0=0; idx0<sz0; idx0++ )
166  for ( int idx1=0; idx1<sz1; idx1++ )
167  get( idx0, idx1 ) *= fac;
168 }
169 
170 
171 template <class fT>
172 inline void Array2DMatrix<fT>::multiply( const Array2DMatrix& in )
173 {
174  const Array2DMatrix copy( *this );
175  copy.getProduct( in, *this );
176 }
177 
178 
179 #define mA2DMatHandleDimErr(v1,v2) \
180 if ( v1 != v2 ) \
181 { \
182  BufferString emsg( "Dim error: " #v1 "=", v1, " " #v2 "=" ); \
183  emsg.add( v2 ); pErrMsg( emsg ); \
184  if ( v2 > v1 ) \
185  const_cast<int&>( v2 ) = v1; \
186  else \
187  const_cast<int&>( v1 ) = v2; \
188 }
189 
190 
191 template <class fT>
192 inline void Array2DMatrix<fT>::getSum( const Array2DMatrix& in,
193  Array2DMatrix& out ) const
194 {
196  mDefineA2DMatSizes( in, insz );
197  const int outsz0 = insz0 > sz0 ? sz0 : insz0;
198  const int outsz1 = insz1 > sz1 ? sz1 : insz1;
199  out.a2d_.setSize( outsz0, outsz1 );
200 
201  for ( int idx0=0; idx0<outsz0; idx0++ )
202  {
203  for ( int idx1=0; idx1<outsz1; idx1++ )
204  {
205  fT res = 0;
206  for ( int idx=0; idx<sz1; idx++ )
207  out.set( idx0, idx1, get(idx0,idx1) + in.get(idx0,idx1) );
208  }
209  }
210 }
211 
212 
213 template <class fT>
215  Array1DVector& vout ) const
216 {
218  const int vsz = vin.info().getSize(0);
219  mA2DMatHandleDimErr(vsz,sz1)
220  vout.setSize( vsz );
221 
222  for ( int idx0=0; idx0<sz0; idx0++ )
223  {
224  fT res = 0;
225  for ( int idx1=0; idx1<sz1; idx1++ )
226  res += get( idx0, idx1 ) * vin.get( idx1 );
227  vout.set( idx0, res );
228  }
229 }
230 
231 
232 template <class fT>
233 inline void Array2DMatrix<fT>::getProduct( const Array2DMatrix& in,
234  Array2DMatrix& out ) const
235 {
237  mDefineA2DMatSizes( in, insz );
238  mA2DMatHandleDimErr(sz1,insz0)
239  out.a2d_.setSize( sz0, insz1 );
240 
241  for ( int idx0=0; idx0<sz0; idx0++ )
242  {
243  for ( int idx1=0; idx1<insz1; idx1++ )
244  {
245  fT res = 0;
246  for ( int idx=0; idx<sz1; idx++ )
247  res += in.get( idx, idx1 ) * get( idx0, idx );
248  out.set( idx0, idx1, res );
249  }
250  }
251 }
252 
253 
254 template <class fT>
256 {
257  const Array2DMatrix copy( *this );
258  copy.getTransposed( *this );
259 }
260 
261 
262 template <class fT>
264 {
266  out.a2d_.setSize( sz1, sz0 );
267 
268  for ( int idx0=0; idx0<sz0; idx0++ )
269  {
270  for ( int idx1=0; idx1<sz1; idx1++ )
271  out.set( idx1, idx0, get( idx0, idx1 ) );
272  }
273 }
274 
275 
276 template <class fT>
277 inline bool Array2DMatrix<fT>::getCholesky( Array2DMatrix& out ) const
278 {
280  mA2DMatHandleDimErr(sz0,sz1)
281  out.a2d_.setSize( sz0, sz0 );
282 
283  out.setAll( 0 );
284 
285  for( int idx0=0; idx0<sz0; idx0++ )
286  {
287  for ( int idx1=0; idx1<=idx0; idx1++ )
288  {
289  fT sum = 0;
290  for ( int j=0; j<idx1; j++ )
291  sum += out.get( idx0, j ) * out.get( idx1, j );
292 
293  fT val = 0;
294  if ( idx0 == idx1 )
295  {
296  val = get( idx0, idx0 ) - sum;
297  if ( val < 0 )
298  return false;
299  val = Math::Sqrt( val );
300  }
301  else
302  {
303  const fT dividend = get( idx0, idx1 ) - sum;
304  const fT divideby = out.get( idx1, idx1 );
305  if ( divideby )
306  val = dividend / divideby;
307  else if ( dividend )
308  return false;
309  }
310  out.set( idx0, idx1, val );
311  }
312  }
313 
314  return true;
315 }
Array2DMatrix(const Array2D< fT > &a2d)
Definition: array2dmatrix.h:40
Array1DImpl< float > Array1DVector
Definition: array2dmatrix.h:19
Array2DMatrix(const Array2DMatrix &oth)
Definition: array2dmatrix.h:36
void getTransposed(Array2DMatrix &)
Definition: array2dmatrix.h:263
void multiply(fT)
Definition: array2dmatrix.h:162
bool operator==(const ArrayNDInfo &a1, const ArrayNDInfo &a2)
Definition: arrayndinfo.h:51
virtual T get(int p0, int p1) const =0
void add(fT)
Definition: array2dmatrix.h:132
#define mDefineA2DMatSizes(m, nm)
easily define the matrix dimension sizes
Definition: array2dmatrix.h:79
#define od_int64
Definition: plftypes.h:34
void getProduct(const Array1DVector &, Array1DVector &) const
Definition: array2dmatrix.h:214
bool isEq(const Array2D< fT > &, fT eps=fT(1e-6)) const
Definition: array2dmatrix.h:102
fT & get(int i0, int i1)
Definition: array2dmatrix.h:91
Matrix class based on Array2D. Initialized to 0.
Definition: array2dmatrix.h:30
void set(int pos, T)
Definition: arrayndimpl.h:359
#define mA2DMatHandleDimErr(v1, v2)
Definition: array2dmatrix.h:179
void set(int i0, int i1, fT v)
Definition: array2dmatrix.h:53
virtual int getSize(int dim) const =0
bool isFPEqual(T1 v1, T2 v2, eT eps)
Definition: commondefs.h:40
RetType getSum(const ArrayND< ArrType > &in, bool noudf, bool parallel)
returns the sum of all defined values in the Array. Returns UDF if empty or only udfs encountered...
Definition: arrayndalgo.h:391
Array2D ( Subclass of ArrayND ) is a two dimensional array.
Definition: arraynd.h:127
bool setSize(int)
Definition: arrayndimpl.h:400
Array2DImpl< fT > a2d_
Definition: array2dmatrix.h:73
void setDiagonal(fT)
Definition: array2dmatrix.h:121
void setAll(fT v=fT(0))
Definition: array2dmatrix.h:57
void getSum(const Array2DMatrix &, Array2DMatrix &) const
Definition: array2dmatrix.h:192
void getProduct(const ArrayND< ArrType > &in1, const ArrayND< ArrType > &in2, ArrayND< ArrType > &out, bool noudf, bool parallel)
computes the product array between two arrays
Definition: arrayndalgo.h:466
#define mDefineImplA2DMatSizes
Definition: array2dmatrix.h:98
Array2DMatrix(int sz0=1, int sz1=0)
Definition: array2dmatrix.h:33
bool setSize(int, int)
Definition: arrayndimpl.h:515
void setToIdentity()
Definition: array2dmatrix.h:59
int size(bool dim1=false) const
Definition: array2dmatrix.h:84
Array2DMatrix(const Array2DImpl< fT > &a2d)
Definition: array2dmatrix.h:38
void copy(TypeSetBase< T, I > &to, const TypeSetBase< S, I > &from)
Definition: typeset.h:221
#define mClass(module)
Definition: commondefs.h:161
bool getCholesky(Array2DMatrix &) const
Definition: array2dmatrix.h:277
const Array1DInfo & info() const
Definition: arrayndimpl.h:75
float Sqrt(float)
void transpose()
Definition: array2dmatrix.h:255
T get(int pos) const
Definition: arrayndimpl.h:371

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