matrix4d.hpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #ifndef _H_MATRIX4D
  2. #define _H_MATRIX4D
  3. #include <vector>
  4. using namespace std;
  5. typedef unsigned int uint;
  6. class M4DRange
  7. {
  8. public:
  9. uint LowBound, HighBound;
  10. M4DRange(): Placeholder_All(true) {};
  11. M4DRange(uint low): LowBound(low), HighBound(low+1), Placeholder_All(false){};
  12. M4DRange(uint low, uint high): LowBound(low), HighBound(high), Placeholder_All(false){};
  13. void SetNMax(uint NumOfElements)
  14. {
  15. if (Placeholder_All) {
  16. LowBound=0;
  17. HighBound=NumOfElements;
  18. };
  19. if (HighBound>NumOfElements) {
  20. HighBound=NumOfElements;
  21. }
  22. if (LowBound>HighBound) {
  23. LowBound=HighBound;
  24. }
  25. };
  26. uint GetDiff()
  27. {
  28. return HighBound-LowBound;
  29. }
  30. private:
  31. bool Placeholder_All;
  32. };
  33. class Matrix4D
  34. {
  35. private:
  36. uint DimA, DimB, DimC, DimD;
  37. vector <vector <vector <vector <float> > > > Data;
  38. public:
  39. Matrix4D(){};
  40. Matrix4D(uint a, uint b, uint c, uint d):
  41. DimA(a), DimB(b), DimC(c), DimD(d)
  42. {
  43. Resize();
  44. };
  45. void GetDimensions(uint &a, uint &b, uint &c, uint &d) const
  46. {
  47. a=DimA;
  48. b=DimB;
  49. c=DimC;
  50. d=DimD;
  51. }
  52. void Resize(uint a, uint b, uint c, uint d)
  53. {
  54. DimA=a;
  55. DimB=b;
  56. DimC=c;
  57. DimD=d;
  58. Resize();
  59. }
  60. void Resize()
  61. {
  62. Data.resize(DimA);
  63. for(uint ia=0;ia<DimA;++ia) {
  64. Data[ia].resize(DimB);
  65. for (uint ib=0;ib<DimB;++ib) {
  66. Data[ia][ib].resize(DimC);
  67. for (uint ic=0;ic<DimC;++ic) {
  68. Data[ia][ib][ic].resize(DimD);
  69. }
  70. }
  71. }
  72. }
  73. void SetValue(float val)
  74. {
  75. for(uint ia=0;ia<DimA;++ia) {
  76. for (uint ib=0;ib<DimB;++ib) {
  77. for (uint ic=0;ic<DimC;++ic) {
  78. for (uint id=0;id<DimD;++id) {
  79. Data[ia][ib][ic][id]=val;
  80. }
  81. }
  82. }
  83. }
  84. }
  85. void SetValue(float val, uint a, uint b, uint c, uint d)
  86. {
  87. // if (a<DimA && b<DimB && c<DimC && d<DimD)
  88. {
  89. Data[a][b][c][d]=val;
  90. }
  91. }
  92. /** Set Data in Matrix
  93. *
  94. * @param InputData is a input vector. \n
  95. * pay attention to data order!\n
  96. * Data[a][b][c][d] == InputData[x]
  97. * Data[a][b][c][d+k] == InputData[x+k]
  98. * Data[a][b][c+k][d] == InputData[x+k*DimD]
  99. * @param RangeA
  100. * @param RangeB
  101. * @param RangeC
  102. * @param RangeD
  103. */
  104. void SetData(const vector<float>& InputData,
  105. M4DRange RangeA, M4DRange RangeB,
  106. M4DRange RangeC, M4DRange RangeD)
  107. {
  108. RangeA.SetNMax(DimA);
  109. RangeB.SetNMax(DimB);
  110. RangeC.SetNMax(DimC);
  111. RangeD.SetNMax(DimD);
  112. size_t NElements = InputData.size();
  113. size_t count=0;
  114. for (uint a=RangeA.LowBound;a<RangeA.HighBound;++a) {
  115. for (uint b=RangeB.LowBound;b<RangeB.HighBound;++b) {
  116. for (uint c=RangeC.LowBound;c<RangeC.HighBound;++c) {
  117. for (uint d=RangeD.LowBound;d<RangeD.HighBound;++d) {
  118. if (count < NElements) {
  119. Data[a][b][c][d]=InputData[count];
  120. ++count;
  121. }
  122. }
  123. }
  124. }
  125. }
  126. };
  127. /** Get Data from Matrix
  128. *
  129. * @param OutputData is a return vector. \n
  130. * pay attention to data order!\n
  131. * Data[a][b][c][d] == OutputData[x]
  132. * Data[a][b][c][d+k] == OutputData[x+k]
  133. * Data[a][b][c+k][d] == OutputData[x+k*DimD]
  134. * @param RangeA
  135. * @param RangeB
  136. * @param RangeC
  137. * @param RangeD
  138. */
  139. void GetData(vector<float>& OutputData,
  140. M4DRange RangeA, M4DRange RangeB,
  141. M4DRange RangeC, M4DRange RangeD) const
  142. {
  143. RangeA.SetNMax(DimA);
  144. RangeB.SetNMax(DimB);
  145. RangeC.SetNMax(DimC);
  146. RangeD.SetNMax(DimD);
  147. size_t NElements = RangeA.GetDiff()
  148. * RangeB.GetDiff()
  149. * RangeC.GetDiff()
  150. * RangeD.GetDiff();
  151. OutputData.resize(NElements);
  152. size_t count=0;
  153. for (uint a=RangeA.LowBound;a<RangeA.HighBound;++a) {
  154. for (uint b=RangeB.LowBound;b<RangeB.HighBound;++b) {
  155. for (uint c=RangeC.LowBound;c<RangeC.HighBound;++c) {
  156. for (uint d=RangeD.LowBound;d<RangeD.HighBound;++d) {
  157. if (count < NElements) {
  158. OutputData[count] = Data[a][b][c][d];
  159. ++count;
  160. }
  161. }
  162. }
  163. }
  164. }
  165. };
  166. };
  167. #endif // _H_MATRIX4D