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

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