Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool OMPInverse(Matrix& other, Matrix& result)
- {
- #pragma omp parallel for
- for (int i = 0; i < n * n; ++i)
- result.mas[i] = 0.0;
- for (int i = 0; i < n; ++i)
- result.mas[i*n + i] = 1.0;
- for (size_t i = 0; i < n; ++i)
- {
- if (fabs(other.mas[i*n + i]) < 1e-8)
- {
- bool b = false;
- for (size_t j = i + 1; j < n; ++j)
- {
- if (fabs(other.mas[j*n + i]) > 1e-8)
- {
- for (size_t k = 0; k < n; ++k)
- {
- swap(other.mas[j*n + k], other.mas[i*n + k]);
- swap(result.mas[j*n + k], result.mas[i*n + k]);
- }
- b = true;
- break;
- }
- }
- if (!b)
- return false;
- }
- float top = other.mas[i*n + i];
- #pragma omp parallel for
- for (int j = 0; j < n; ++j)
- {
- other.mas[i*n + j] /= top;
- result.mas[i*n + j] /= top;
- }
- for (int j = i + 1; j < n; ++j)
- {
- float rowel = other.mas[j*n + i];
- #pragma omp parallel for
- for (int k = 0; k < n; ++k)
- {
- other.mas[j*n + k] -= rowel * other.mas[i*n + k];
- result.mas[j*n + k] -= rowel * result.mas[i*n + k];
- }
- }
- }
- for (size_t i = n - 1; i > 0; --i)
- {
- for (size_t j = i - 1; j + 1 > 0; --j)
- {
- float f = other.mas[j*n + i];
- #pragma omp parallel for
- for (int k = 0; k < n; ++k)
- {
- other.mas[j*n + k] -= f * other.mas[i*n + k];
- result.mas[j*n + k] -= f * result.mas[i*n + k];
- }
- }
- }
- return true;
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement