Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.40 KB | None | 0 0
  1. #include "Matrix.h"
  2. #include <cstdlib>
  3. #include <iostream>
  4. void CMatrix::Add(const CMatrix & m) throw(invalid_argument)
  5. {
  6. uint32_t rows2, columns2;
  7. this->GetSize(rows2, columns2);
  8. m.GetSize(rows, columns);
  9. CMatrix mat = m;
  10. if (rows != rows2 || columns != columns2) throw invalid_argument("invalid argument");
  11. for (unsigned int i = 0; i < rows; i++)
  12. {
  13. for (unsigned int j = 0; j < columns; j++)
  14. {
  15.  
  16. this->matrix[i][j] = matrix[i][j] + mat.GetElement(i, j);
  17. }
  18.  
  19. }
  20. }
  21.  
  22. void CMatrix::Sub(const CMatrix & m) throw(invalid_argument)
  23. {
  24. uint32_t rows2, columns2;
  25. this->GetSize(rows2, columns2);
  26. m.GetSize(rows, columns);
  27. CMatrix mat = m;
  28. if (rows != rows2 || columns != columns2) throw invalid_argument("invalid argument");
  29. for (unsigned int i = 0; i < rows; i++)
  30. {
  31. for (unsigned int j = 0; j < columns; j++)
  32. {
  33.  
  34. this->matrix[i][j] = matrix[i][j] - mat.GetElement(i, j);
  35. }
  36.  
  37. }
  38. }
  39.  
  40. CMatrix CMatrix::Mul(const CMatrix & m) const throw(invalid_argument)
  41. {
  42.  
  43. uint32_t rows, columns, rows2, columns2;
  44. m.GetSize(rows, columns);
  45. this->GetSize(rows2, columns2);
  46. if (columns2 != rows) throw invalid_argument("incalid argument");
  47. for (unsigned int i = 0; i < rows2; i++)
  48. {
  49. for (unsigned int j = 0; j < columns; j++)
  50. {
  51. double s = 0;
  52.  
  53. for (unsigned int k = 0; k < columns2; k++)
  54. {
  55. s = s + this->matrix[i][k] * m.matrix[k][j];
  56. }
  57.  
  58. }
  59. }
  60. }
  61. void CMatrix::Mul(const double & scalar) throw(invalid_argument)
  62. {
  63.  
  64. for (unsigned int i = 0; i < rows; i++)
  65. {
  66. for (unsigned int j = 0; j < columns; j++)
  67. {
  68. matrix[i][j] = matrix[i][j] * scalar;
  69.  
  70. }
  71.  
  72. }
  73. }
  74.  
  75. void CMatrix::Div(const double & scalar) throw(invalid_argument)
  76. {
  77. for (unsigned int i = 0; i < rows; i++)
  78. {
  79. for (unsigned int j = 0; j < columns; j++)
  80. {
  81. matrix[i][j] = matrix[i][j] / scalar;
  82.  
  83. }
  84.  
  85. }
  86. }
  87.  
  88. CMatrix::CMatrix(uint32_t rows, uint32_t columns)
  89. {
  90. this->rows = rows;
  91. this->columns = columns;
  92. matrix = new double*[rows];
  93. for (unsigned int i = 0; i < rows; i++) {
  94. matrix[i] = new double[columns];
  95. }
  96.  
  97. for (unsigned int n = 0; n < rows; n++)
  98. {
  99. for (unsigned int m = 0; m < columns; m++)
  100. {
  101. matrix[n][m] = 0;
  102. }
  103. }
  104. }
  105.  
  106. CMatrix::CMatrix(uint32_t rows, uint32_t columns, double ** mat)
  107. {
  108.  
  109.  
  110. matrix = new double*[rows];
  111. for (unsigned int i = 0; i < rows; i++) {
  112. matrix[i] = new double[columns];
  113. }
  114.  
  115. for (uint32_t a = 0; a < rows; a++) {
  116. for (uint32_t b = 0; b < columns; b++) {
  117. matrix[a][b] = mat[a][b];
  118. }
  119.  
  120. }
  121.  
  122. this->rows = rows;
  123. this->columns = columns;
  124. }
  125.  
  126. CMatrix::CMatrix(uint32_t rows, uint32_t columns, double * mat)
  127. {
  128.  
  129.  
  130. matrix = new double*[rows];
  131. for (unsigned int i = 0; i < rows; i++) {
  132. matrix[i] = new double[columns];
  133. }
  134. for (unsigned int i = 0; i < rows; i++)
  135. {
  136. for (uint32_t a = 0; a < rows; a++) {
  137. for (uint32_t b = 0; b < columns; b++) {
  138. matrix[a][b] = *(mat + a*columns) + b;
  139. }
  140.  
  141. }
  142. this->rows = rows;
  143. this->columns = columns;
  144. }
  145. }
  146.  
  147. CMatrix::CMatrix(const CMatrix & M)
  148. {
  149.  
  150. uint32_t rows2, columns2;
  151. this->GetSize(rows2, columns2);
  152. M.GetSize(rows, columns);
  153. CMatrix new_macierz(rows, columns);
  154.  
  155. for (uint32_t a = 0; a < rows; a++) {
  156. for (uint32_t b = 0; b < columns; b++) {
  157. new_macierz[a][b]=M.matrix[a][b];
  158. }
  159. }
  160.  
  161.  
  162. }
  163.  
  164. CMatrix & CMatrix::operator=(const CMatrix & m)
  165. {
  166.  
  167. double ** n_mat = new double*[m.rows];
  168. for (unsigned int i = 0; i < m.rows; i++)
  169. {
  170. n_mat[i] = new double[m.columns];
  171. }
  172.  
  173.  
  174.  
  175. for (unsigned int i = 0; i < m.rows; i++)
  176. {
  177. memcpy(n_mat[i], m.matrix[i], sizeof(double)*m.columns);
  178. }
  179.  
  180.  
  181.  
  182. for (unsigned int i = 0; i < rows; i++)
  183. {
  184. delete[] matrix[i];
  185. }
  186. delete[] matrix;
  187.  
  188.  
  189.  
  190.  
  191. matrix = n_mat;
  192.  
  193. rows = m.rows;
  194. columns = m.columns;
  195.  
  196.  
  197. return *this;
  198.  
  199. }
  200.  
  201. CMatrix::~CMatrix()
  202. {
  203. for (unsigned int i = 0; i < rows; i++)
  204. {
  205. delete[] matrix[i];
  206. }
  207. delete[] matrix;
  208. }
  209.  
  210. void CMatrix::GetSize(uint32_t & rows, uint32_t & columns) const
  211. {
  212. columns = this->columns;
  213. rows = this->rows;
  214.  
  215.  
  216. }
  217.  
  218. double & CMatrix::GetElement(uint32_t row, uint32_t column) throw(invalid_argument)
  219. {
  220. if (rows < 0 || columns < 0) throw invalid_argument("invalid argument");
  221. return matrix[row][column];
  222. // TODOreturn;: tu wstawić instrukcję return
  223. }
  224.  
  225. double * CMatrix::operator[](uint32_t row) throw(invalid_argument)
  226. {
  227. return this->matrix[row];
  228. }
  229.  
  230. CMatrix CMatrix::operator+(const CMatrix & m) const
  231. {
  232. CMatrix vec(*this);
  233. vec.Add((const CMatrix)m);
  234. return vec;
  235. }
  236.  
  237. CMatrix & CMatrix::operator+=(const CMatrix & m)
  238. {
  239. CMatrix *mac = this;
  240. mac->Add(m);
  241. return *mac;
  242. }
  243.  
  244. CMatrix CMatrix::operator-(const CMatrix & m) const
  245. {
  246. CMatrix vec(*this);
  247. vec.Sub(( const CMatrix)m);
  248. return vec;
  249.  
  250. }
  251.  
  252. CMatrix & CMatrix::operator-=(const CMatrix & m)
  253. {
  254. /*CMatrix vec(*this);
  255. vec.Sub((const CMatrix)m);
  256. return vec;
  257. */
  258.  
  259. CMatrix *mac = this;
  260. mac->Sub(m);
  261. return *mac;
  262.  
  263. }
  264.  
  265. CMatrix CMatrix::operator*(const CMatrix & m) const
  266. {
  267. CMatrix * vec = new CMatrix(*this);
  268. vec->Mul((const CMatrix)m);
  269. return *vec;
  270. }
  271.  
  272. CMatrix & CMatrix::operator*=(const CMatrix & m)
  273. {
  274. CMatrix *mac = this;
  275. mac->Mul(m);
  276. return *mac;
  277. }
  278.  
  279. CMatrix CMatrix::operator*(const double & scalar) const
  280. {
  281. CMatrix mac = CMatrix(this->rows, this->columns, this->matrix);
  282. mac.Mul(scalar);
  283. return mac;
  284.  
  285.  
  286.  
  287. }
  288.  
  289. CMatrix & CMatrix::operator*=(const double & scalar)
  290. {
  291. CMatrix *mac = this;
  292. mac->Mul(scalar);
  293. return *mac;
  294. }
  295.  
  296. CMatrix CMatrix::operator/(const double & scalar) const
  297. {
  298. CMatrix mac = CMatrix(this->rows, this->columns, this->matrix);
  299. mac.Div(scalar);
  300. return mac;
  301. }
  302.  
  303. CMatrix & CMatrix::operator/=(const double & scalar)
  304. {
  305. CMatrix *mac = this;
  306. mac->Div(scalar);
  307. return *mac;
  308. }
  309.  
  310. CMatrix CMatrix::operator-() const
  311. {
  312. CMatrix mac = CMatrix(this->rows, this->columns, this->matrix);
  313. mac.Mul(-1);
  314. return mac;
  315. }
  316.  
  317. CMatrix CMatrix::T() const
  318. {
  319. CMatrix mac = CMatrix(this->rows, this->columns, this->matrix);
  320. for (unsigned int i = 0; i < rows; i++) {
  321. for (unsigned int j = 0; j < rows; j++)
  322. mac[j][i] = matrix[i][j];
  323. return mac;
  324. }
  325. }
  326.  
  327. ostream & operator<<(ostream & stream, const CMatrix & m)
  328. {
  329. return stream;
  330. }
  331.  
  332. CVector::CVector(uint32_t columns): CMatrix(columns,1)
  333. {
  334.  
  335. }
  336.  
  337. CVector::CVector(uint32_t columns, double * mat):CMatrix(columns,1,matrix)
  338. {
  339.  
  340. }
  341.  
  342. CVector & CVector::operator=(const CMatrix & m)
  343. {
  344. return *this;
  345. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement