Blame view

stim/math/matrix.h 2.43 KB
57729e5b   David Mayerich   changed directory...
1
2
3
4
5
6
  #ifndef RTS_MATRIX_H

  #define RTS_MATRIX_H

  

  //#include "rts/vector.h"

  #include <string.h>

  #include <iostream>

cce7daf9   Pavel Govyadinov   added glObj.h to ...
7
  #include <stim/math/vector.h>

308a743c   David Mayerich   fixed class compa...
8
  #include <stim/math/vec3.h>

7d1d153a   Pavel Govyadinov   fixed the include...
9
  #include <stim/cuda/cudatools/callable.h>

57729e5b   David Mayerich   changed directory...
10
  

8a86bd56   David Mayerich   changed rts names...
11
  namespace stim{

57729e5b   David Mayerich   changed directory...
12
13
14
15
16
17
18
  

  template <class T, int N>

  struct matrix

  {

  	//the matrix will be stored in column-major order (compatible with OpenGL)

  	T M[N*N];

  

d609550e   David Mayerich   fixed bug in plan...
19
  	CUDA_CALLABLE matrix()

57729e5b   David Mayerich   changed directory...
20
21
22
23
24
25
26
27
28
  	{

  		for(int r=0; r<N; r++)

  			for(int c=0; c<N; c++)

  				if(r == c)

  					(*this)(r, c) = 1;

  				else

  					(*this)(r, c) = 0;

  	}

  

b2d10ff1   Pavel Govyadinov   final edits, expa...
29
  	CUDA_CALLABLE matrix(T rhs[N*N])

8e56a0a7   Pavel Govyadinov   Added the propose...
30
  	{

b2d10ff1   Pavel Govyadinov   final edits, expa...
31
32
33
34
35
36
  		memcpy(M,rhs, sizeof(T)*N*N);

  	}

  

  	CUDA_CALLABLE matrix<T,N> set(T rhs[N*N])

  	{

  		memcpy(M, rhs, sizeof(T)*N*N);

8e56a0a7   Pavel Govyadinov   Added the propose...
37
38
  		return *this;

  	}

b2d10ff1   Pavel Govyadinov   final edits, expa...
39
  

19a3973b   David Mayerich   updates to matrix...
40
  	//create a symmetric matrix given the rhs values, given in column-major order

2bd758a6   Jiaming Guo   fix some minor er...
41
  	CUDA_CALLABLE void setsym(T rhs[(N*N+N)/2]){

19a3973b   David Mayerich   updates to matrix...
42
43
44
45
46
  		const size_t L = (N*N+N)/2;		//store the number of values

  

  		size_t r, c;

  		r = c = 0;

  		for(size_t i = 0; i < L; i++){ 				//for each value

2bd758a6   Jiaming Guo   fix some minor er...
47
48
  			if(r == c) M[c * N + r] = rhs[i];

  			else M[c*N + r] = M[r * N + c] = rhs[i];

19a3973b   David Mayerich   updates to matrix...
49
50
51
52
53
  			r++;

  			if(r == N) r = ++c;

  		}

  	}

  

d609550e   David Mayerich   fixed bug in plan...
54
  	CUDA_CALLABLE T& operator()(int row, int col)

57729e5b   David Mayerich   changed directory...
55
56
57
58
  	{

  		return M[col * N + row];

  	}

  

d609550e   David Mayerich   fixed bug in plan...
59
  	CUDA_CALLABLE matrix<T, N> operator=(T rhs)

57729e5b   David Mayerich   changed directory...
60
61
62
63
64
65
66
67
  	{

  		int Nsq = N*N;

  		for(int i=0; i<Nsq; i++)

  			M[i] = rhs;

  

  		return *this;

  	}

  

ecfd14df   David Mayerich   implemented D fie...
68
  	template<typename Y>

8e4f8364   David Mayerich   started a new opt...
69
  	vec<Y> operator*(vec<Y> rhs){

6ada8448   Pavel Govyadinov   Reverted to 40db1...
70
  		unsigned int M = rhs.size();

487a9b49   David Mayerich   added the ability...
71
  

9339fbad   David Mayerich   implementing mie ...
72
  		vec<Y> result;

6ada8448   Pavel Govyadinov   Reverted to 40db1...
73
  		result.resize(M);

57729e5b   David Mayerich   changed directory...
74
  

6ada8448   Pavel Govyadinov   Reverted to 40db1...
75
76
  		for(int r=0; r<M; r++)

  			for(int c=0; c<M; c++)

57729e5b   David Mayerich   changed directory...
77
78
79
80
81
  				result[r] += (*this)(r, c) * rhs[c];

  

  		return result;

  	}

  

8e4f8364   David Mayerich   started a new opt...
82
83
84
85
86
87
88
89
90
91
  	template<typename Y>

  	CUDA_CALLABLE vec3<Y> operator*(vec3<Y> rhs){

  		vec3<Y> result = 0;

  		for(int r=0; r<3; r++)

  			for(int c=0; c<3; c++)

  				result[r] += (*this)(r, c) * rhs[c];

  

  		return result;

  	}

  

b2d10ff1   Pavel Govyadinov   final edits, expa...
92
  	std::string toStr()

57729e5b   David Mayerich   changed directory...
93
94
95
96
97
  	{

  		std::stringstream ss;

  

  		for(int r = 0; r < N; r++)

  		{

b2d10ff1   Pavel Govyadinov   final edits, expa...
98
  			ss << "| ";

57729e5b   David Mayerich   changed directory...
99
100
  			for(int c=0; c<N; c++)

  			{

b2d10ff1   Pavel Govyadinov   final edits, expa...
101
  				ss << (*this)(r, c) << " ";

57729e5b   David Mayerich   changed directory...
102
  			}

b2d10ff1   Pavel Govyadinov   final edits, expa...
103
  			ss << "|" << std::endl;

57729e5b   David Mayerich   changed directory...
104
105
106
107
  		}

  

  		return ss.str();

  	}

19a3973b   David Mayerich   updates to matrix...
108
109
110
111
112
113
114
115
  

  	static matrix<T, N> identity() {

  		matrix<T, N> I;

  		I = 0;

  		for (size_t i = 0; i < N; i++)

  			I.M[i * N + i] = 1;

  		return I;

  	}

57729e5b   David Mayerich   changed directory...
116
117
118
119
120
  };

  

  }	//end namespace rts

  

  template <typename T, int N>

ef70330e   David Mayerich   changed rts to stim
121
  std::ostream& operator<<(std::ostream& os, stim::matrix<T, N> M)

57729e5b   David Mayerich   changed directory...
122
123
124
125
126
127
128
129
130
131
  {

      os<<M.toStr();

      return os;

  }

  

  //#if __GNUC__ > 3 && __GNUC_MINOR__ > 7

  //template<class T, int N> using rtsMatrix = rts::matrix<T, N>;

  //#endif

  

  #endif