Advertisement
qsadfasdgfgads

Untitled

Nov 18th, 2022
513
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <xmmintrin.h>
  3. #include <cstdlib>
  4. #include <cfloat>
  5. #include <random>
  6.  
  7. using namespace std;
  8. const inline size_t M = 10;
  9. const inline size_t N = 128;
  10.  
  11. void CopyMatrix(const float* from, float* to) {
  12.     for (size_t i = 0; i < N; i++) {
  13.         for (size_t j = 0; j < N; j++) {
  14.             to[i * N + j] = from[i * N + j];
  15.         }
  16.     }
  17.  
  18. }
  19.  
  20. void SumMatrix(const float *M1, const float *M2, float *result) {
  21.     for (size_t i = 0; i < N; i++) {
  22.         for (size_t j = 0; j < N; j++) {
  23.             result[i * N + j] = M1[i * N + j] + M2[i * N + j];
  24.         }
  25.     }
  26. }
  27.  
  28. void showMatrix(const float *matrix) {
  29.     size_t i, j;
  30.     for (i = 0; i < N; ++i) {
  31.         for (j = 0; j < N; ++j) {
  32.             cout << matrix[i * N + j] << " ";
  33.         }
  34.         cout << endl;
  35.     }
  36.     cout << "\n\n\n";
  37. }
  38.  
  39. inline float generateRandomInRange(float a, float b) {
  40.     random_device rd;
  41.     uniform_real_distribution gen(a, b);
  42.     return gen(rd);
  43. }
  44.  
  45. float *GenerateMatrixI() {
  46.     auto *I = new float[N * N];
  47.     for (size_t i = 0; i < N; i++) {
  48.         for (size_t j = 0; j < N; j++) {
  49.             if (i == j) I[i * N + j] = 1.0;
  50.             else I[i * N + j] = 0.0;
  51.         }
  52.     }
  53.     return I;
  54. }
  55.  
  56. float *GenerateMatrix() {
  57.     auto *A = new float[N * N];
  58. //  for (size_t i = 0; i < N; i++) {
  59. //      for (size_t j = 0; j < N; j++) {
  60. //          A[i * N + j] = generateRandomInRange(1, 100000);
  61. //      }
  62. //  }
  63.  
  64.     for (int i = 0; i < N; ++i) {
  65.         for (int j = 0; i < N; ++i) {
  66.             A[i * N + j] = static_cast<float>(i * N + j);
  67.         }
  68.     }
  69.  
  70.  
  71.     return A;
  72. }
  73.  
  74. void TransposeMatrix(float *B, const float *A) {
  75.     for (size_t i = 0; i < N; i++)
  76.         for (size_t j = 0; j < N; j++) {
  77.             B[i * N + j] = A[j * N + i];
  78.         }
  79. }
  80.  
  81. float MaxLineCount(const float *matrix) {
  82.     float maximum = FLT_MIN;
  83.     for (size_t i = 0; i < N; i++) {
  84.         float temp = 0;
  85.  
  86.         for (size_t j = 0; j < N; j++) {
  87.             temp += matrix[i * N + j];
  88.         }
  89.  
  90.         if (temp > maximum) {
  91.             maximum = temp;
  92.         }
  93.     }
  94.     return maximum;
  95. }
  96.  
  97. float *GenerateMatrixB(float *A) {
  98.     auto *B = new float[N * N];
  99.     auto *transposedA = new float[N * N];
  100.     TransposeMatrix(transposedA, A);
  101.     float maxRowCount = MaxLineCount(A);
  102.     float maxColumnCount = MaxLineCount(transposedA);
  103.     float divider = 1 / (maxRowCount * maxColumnCount);
  104.     for (size_t i = 0; i < N; i++) {
  105.         for (size_t j = 0; j < N; j++) {
  106.             B[i * N + j] = transposedA[i * N + j] * divider;
  107.         }
  108.     }
  109.     delete[] transposedA;
  110.     return B;
  111. }
  112.  
  113. float* MultiplyMatrices(const float* matrix_1, const float* matrix_2)
  114. {
  115.     __m128 vector_2;//переменная для хранения значения второй матрицы
  116.     __m128 result_vector;//переменная для записи итоговой марицы
  117.     auto* result_matrix = (float*)_mm_malloc(N * N * sizeof(float), 16);//выделение памяти с выравниванием
  118.     for (int i = 0; i < N; ++i) {
  119.         for (int j = 0; j < N; ++j) {
  120.             __m128 element_vector = _mm_set1_ps(matrix_1[i * N + j]);//4 позиции в одно значение
  121.             for (int k = 0; k < N; k += 4) {
  122.                 vector_2 = _mm_load_ps(&matrix_2[j * N + k]);//4 значение по адресу
  123.                 result_vector = _mm_load_ps(&result_matrix[i * N + k]);
  124.                 result_vector = _mm_add_ps(result_vector, _mm_mul_ps(element_vector, vector_2));
  125.                 _mm_store_ps(&result_matrix[i * N + k], result_vector);
  126.             }
  127.         }
  128.     }
  129.     return result_matrix;
  130. }
  131.  
  132.  
  133. void SubtractMatrix(const float *I, const float *multed, float *R) {
  134.     for (size_t i = 0; i < N; i++)
  135.         for (size_t j = 0; j < N; j++)
  136.             R[i * N + j] = I[i * N + j] - multed[i * N + j];
  137. }
  138.  
  139. float *GenerateMatrixR(const float *A, float *I, const float *B) {
  140.     auto *R = new float[N * N];
  141.     auto *multed = MultiplyMatrices(B, A);
  142.     // R - BA
  143.     SubtractMatrix(I, multed, R);
  144.     delete[] multed;
  145.     return R;
  146. }
  147.  
  148. float *GetInversedMatrix(float *A) {
  149.     float *I = GenerateMatrixI();
  150.     auto *copyI = new float[N*N];
  151.     CopyMatrix(I, copyI);
  152.  
  153.     float *B = GenerateMatrixB(A);
  154.     float *R = GenerateMatrixR(A, copyI, B);
  155.  
  156.  
  157.     float *Rn = R;
  158.     float *t;
  159.  
  160.     SumMatrix(I, Rn, I);
  161.     for (size_t i = 0; i < M; i++) {
  162.         t = MultiplyMatrices(Rn, R);
  163.         if (i != 0) delete[] Rn;
  164.         Rn = t;
  165.         SumMatrix(I, Rn, I);
  166.     }
  167.  
  168.     auto new_I = MultiplyMatrices(I, B);
  169.  
  170.     delete[] I;
  171.     delete[] B;
  172.     delete[] R;
  173.     delete[] t;
  174.     delete [] copyI;
  175.     return new_I;
  176. }
  177.  
  178. int main() {
  179.     float *A = GenerateMatrix();
  180.     float *InversedA = GetInversedMatrix(A);
  181.     showMatrix(MultiplyMatrices(A,InversedA));
  182.  
  183.     delete[] A;
  184.     delete[] InversedA;
  185.     return 0;
  186. }
  187.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement