Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2014
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.43 KB | None | 0 0
  1. bool OMPInverse(Matrix& other, Matrix& result)
  2. {
  3. #pragma omp parallel for
  4. for (int i = 0; i < n * n; ++i)
  5. result.mas[i] = 0.0;
  6.  
  7. for (int i = 0; i < n; ++i)
  8. result.mas[i*n + i] = 1.0;
  9.  
  10. for (size_t i = 0; i < n; ++i)
  11. {
  12. if (fabs(other.mas[i*n + i]) < 1e-8)
  13. {
  14. bool b = false;
  15.  
  16. for (size_t j = i + 1; j < n; ++j)
  17. {
  18. if (fabs(other.mas[j*n + i]) > 1e-8)
  19. {
  20. for (size_t k = 0; k < n; ++k)
  21. {
  22. swap(other.mas[j*n + k], other.mas[i*n + k]);
  23. swap(result.mas[j*n + k], result.mas[i*n + k]);
  24. }
  25. b = true;
  26. break;
  27. }
  28. }
  29.  
  30. if (!b)
  31. return false;
  32. }
  33.  
  34. float top = other.mas[i*n + i];
  35.  
  36. #pragma omp parallel for
  37. for (int j = 0; j < n; ++j)
  38. {
  39. other.mas[i*n + j] /= top;
  40. result.mas[i*n + j] /= top;
  41. }
  42.  
  43. for (int j = i + 1; j < n; ++j)
  44. {
  45. float rowel = other.mas[j*n + i];
  46.  
  47. #pragma omp parallel for
  48. for (int k = 0; k < n; ++k)
  49. {
  50. other.mas[j*n + k] -= rowel * other.mas[i*n + k];
  51. result.mas[j*n + k] -= rowel * result.mas[i*n + k];
  52. }
  53. }
  54. }
  55.  
  56. for (size_t i = n - 1; i > 0; --i)
  57. {
  58. for (size_t j = i - 1; j + 1 > 0; --j)
  59. {
  60. float f = other.mas[j*n + i];
  61.  
  62. #pragma omp parallel for
  63. for (int k = 0; k < n; ++k)
  64. {
  65. other.mas[j*n + k] -= f * other.mas[i*n + k];
  66. result.mas[j*n + k] -= f * result.mas[i*n + k];
  67. }
  68. }
  69. }
  70.  
  71. return true;
  72. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement