Advertisement
Solingen

z14.2.cpp

Dec 22nd, 2024
14
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.51 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. // Функция для вычисления ранга матрицы A (m x n)
  6. int matrixRank(vector<vector<double>>& A)
  7. {
  8.     int m = A.size();
  9.     if(m == 0) return 0;
  10.     int n = A[0].size();
  11.  
  12.     int rank = 0;
  13.     int row = 0;
  14.     for(int col = 0; col < n && row < m; col++)
  15.     {
  16.         // Ищем pivotRow
  17.         int pivotRow = row;
  18.         while(pivotRow < m && A[pivotRow][col] == 0.0)
  19.         {
  20.             pivotRow++;
  21.         }
  22.         if(pivotRow == m) continue; // нет pivot в этом столбце
  23.  
  24.         // swap
  25.         if(pivotRow != row)
  26.         {
  27.             A[row].swap(A[pivotRow]);
  28.         }
  29.  
  30.         // нормируем
  31.         double pivot = A[row][col];
  32.         for(int c = col; c < n; c++)
  33.         {
  34.             A[row][c] /= pivot;
  35.         }
  36.         // зануляем в строках ниже
  37.         for(int r = row+1; r < m; r++)
  38.         {
  39.             double factor = A[r][col];
  40.             for(int c = col; c < n; c++)
  41.             {
  42.                 A[r][c] -= factor*A[row][c];
  43.             }
  44.         }
  45.         rank++;
  46.         row++;
  47.     }
  48.     return rank;
  49. }
  50.  
  51. int main()
  52. {
  53.     int m, n;
  54.     cin >> m >> n;
  55.     vector<vector<double>> mat(m, vector<double>(n));
  56.     for(int i = 0; i < m; i++)
  57.     {
  58.         for(int j = 0; j < n; j++)
  59.         {
  60.             cin >> mat[i][j];
  61.         }
  62.     }
  63.  
  64.     int r = matrixRank(mat);
  65.     cout << "Ранг = " << r << endl;
  66.     return 0;
  67. }
  68.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement