【问题标题】:Flip matrix across its diagonal [closed]在其对角线上翻转矩阵[关闭]
【发布时间】:2020-02-07 22:45:33
【问题描述】:

在第二个矩阵中重新排序我的数值的最简单方法是什么,其中 90 在左上角,10 在右下角?我的大脑一片空白,我知道必须有任何简单的方法来解决这个问题。非常感谢任何帮助!

这就是我想要实现的目标。

#include <iostream>
using namespace std;


void main() {
    cout << "Before:" << endl;
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            int matrix[9][9] = {

            { 10,11,12,13,14,15,16,17,18 },
            { 19,20,21,22,23,24,25,26,27,},
            { 28,29,30,31,32,33,34,35,36 },
            { 37,38,39,40,41,42,43,44,45 },
            { 46,47,48,49,50,51,52,53,54 },
            { 55,56,57,58,59,60,61,62,63 },
            { 64,65,66,67,68,69,70,71,72 },
            { 73,74,75,76,77,78,79,80,81 },
            { 82,83,84,85,86,87,88,89,90 }
            };
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }



    cout << "After:" << endl;
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            int transMatrix[9][9] = {

            { 10,11,12,13,14,15,16,17,18 },
            { 19,20,21,22,23,24,25,26,27,},
            { 28,29,30,31,32,33,34,35,36 },
            { 37,38,39,40,41,42,43,44,45 },
            { 46,47,48,49,50,51,52,53,54 },
            { 55,56,57,58,59,60,61,62,63 },
            { 64,65,66,67,68,69,70,71,72 },
            { 73,74,75,76,77,78,79,80,81 },
            { 82,83,84,85,86,87,88,89,90 }
            };
            cout << transMatrix[j][i] << " ";
        }
        cout << endl;
    }
}

【问题讨论】:

  • std::transform 肯定能胜任
  • @Ian Copenhaver 至于我,我还没有理解这个问题。:)
  • @VladfromMoscow 我认为 Ian 想对角映射矩阵
  • 我已根据我对问题的理解(以及我尝试阅读屏幕截图缩略图中模糊的文字)修正了标题和说明。

标签: c++ loops for-loop multidimensional-array


【解决方案1】:

你可以反向循环。

for (int i = 8; i >= 0; i--) {
    for (int j = 8; j >= 0; j--) {
        //Print element [j][i] here
    }
}

Federico 所指出的,还将矩阵分配移到循环之外

【讨论】:

    【解决方案2】:

    让我们考虑以下矩阵

    #define ROW 3
    #define COL 4
    
    int main()
    {
        int mat [ROW][COL] = {
                                {1,  2,  3,  4},
                                {5,  6,  7,  8},
                                {9, 10, 11, 12}
                             };
        //...
    
        return 0;
    }
    

    1/如果你想要后向矩阵

    int backwards_mat[ROW][COL];
    for(size_t i = 0; i < ROW; ++i)
    {
        for(size_t j = 0; j < COL; ++j)
        {
            backwards_mat[i][j] = mat[ROW-1-i][COL-1-j];
        }
    }
    

    2/如果你想要转置矩阵

    int transposed_mat[COL][ROW]; //swap the dimensions
    for(size_t i = 0; i < ROW; ++i)
    {
        for(size_t j = 0; j < COL; ++j)
        {
            transposed_mat[j][i] = mat[i][j];
        }
    }
    

    如果你打印两个矩阵,倒数是:

    12 11 10 9
    8 7 6 5
    4 3 2 1

    转置后的将是:

    1 5 9
    2 6 10
    3 7 11
    4 8 12


    您应该能够轻松地将其应用于您的矩阵。

    【讨论】:

      【解决方案3】:

      你的意思是以下吗?

      #include <iostream>
      #include <utility>
      
      int main()
      {
          const size_t N = 9;
          int matrix[N][N] = 
          {
              { 10,11,12,13,14,15,16,17,18 },
              { 19,20,21,22,23,24,25,26,27,},
              { 28,29,30,31,32,33,34,35,36 },
              { 37,38,39,40,41,42,43,44,45 },
              { 46,47,48,49,50,51,52,53,54 },
              { 55,56,57,58,59,60,61,62,63 },
              { 64,65,66,67,68,69,70,71,72 },
              { 73,74,75,76,77,78,79,80,81 },
              { 82,83,84,85,86,87,88,89,90 }
          };
      
          for ( const auto &row : matrix )
          {
              for ( const auto &item : row ) std::cout << item << ' ';
              std::cout << '\n';
          }            
      
          std::cout << '\n';
      
          for ( size_t i = 0; i < N; i++ )
          {
              for ( size_t j = 0; j < N - i - 1; j++ ) std::swap( matrix[i][j], matrix[N-j-1][N-i-1] );
          }
      
          for ( const auto &row : matrix )
          {
              for ( const auto &item : row ) std::cout << item << ' ';
              std::cout << '\n';
          }            
      
          std::cout << '\n';
      }
      

      程序输出是

      10 11 12 13 14 15 16 17 18 
      19 20 21 22 23 24 25 26 27 
      28 29 30 31 32 33 34 35 36 
      37 38 39 40 41 42 43 44 45 
      46 47 48 49 50 51 52 53 54 
      55 56 57 58 59 60 61 62 63 
      64 65 66 67 68 69 70 71 72 
      73 74 75 76 77 78 79 80 81 
      82 83 84 85 86 87 88 89 90 
      
      90 81 72 63 54 45 36 27 18 
      89 80 71 62 53 44 35 26 17 
      88 79 70 61 52 43 34 25 16 
      87 78 69 60 51 42 33 24 15 
      86 77 68 59 50 41 32 23 14 
      85 76 67 58 49 40 31 22 13 
      84 75 66 57 48 39 30 21 12 
      83 74 65 56 47 38 29 20 11 
      82 73 64 55 46 37 28 19 10
      

      【讨论】:

        猜你喜欢
        • 2018-05-09
        • 1970-01-01
        • 2011-03-27
        • 1970-01-01
        • 1970-01-01
        • 2016-06-02
        • 1970-01-01
        • 1970-01-01
        • 2019-04-14
        相关资源
        最近更新 更多