代码之家  ›  专栏  ›  技术社区  ›  DarkLeafyGreen

计算反射矩阵

  •  4
  • DarkLeafyGreen  · 技术社区  · 14 年前

    我有以下5x5矩阵:

    11 21 31 41 51
    12 22 32 42 52
    13 23 33 43 53
    14 24 34 44 54
    15 25 35 45 55
    

    现在我想反映这个矩阵,得到以下结果:

    55 54 53 52 51
    45 44 43 42 41
    35 34 33 32 31
    25 24 23 22 21
    15 14 13 12 11
    

    原始矩阵由 二维数组矩阵[行][列] . 所以我们的想法是交换价值观。

    我的策略是:

    (1,1) with (5,5)
    (1,2) with (4,5)
    (1,3) with (3,5)
    (1,4) with (2,5)
    
    and
    
    (2,1) with (5,4)
    (2,2) with (4,4)
    (2,3) with (3,4)
    (2,4) with (2,4)
    
    ...
    

    这是我的代码:

                for(int i = 0; i < 5; i++){
                    for(int k = 0; k < 4; k++){
                        int f = matrix[i][k];
                        int s = matrix[4-k][4-i];
                        matrix[i][k] = s;
                        matrix[4-k][4-i] = f;
    
                    }
                }
    

    代码不起作用。有什么想法吗?

    3 回复  |  直到 13 年前
        1
  •  4
  •   codaddict    14 年前

    您将交换元素两次。您只需要交换上(或下)对角线元素。你可以这样做:

    int size = arr.length;
    for(int i=0;i<size;i++){
            for(int j=0;j<size-i;j++){
                    int tmp = arr[i][j];
                    arr[i][j] = arr[size-j-1][size-i-1];
                    arr[size-j-1][size-i-1] = tmp;
            }                                                      
    }
    

    Code In Action

        2
  •  1
  •   dirbacke    14 年前

    您可以使用相同矩阵的副本,以便能够将值存储在新矩阵2中。
    (martix != matrix2) 是真的。
    现在我用这个代码来反转你的矩阵:

    
    for(int i=0; i<5; i++) {
      for(int j=0; j<5; j++) {
        matrix[i][j] = matrix2[4-j][4-i];
      }
    }
        3
  •  1
  •   Tim Visher    14 年前

    我决定将其视为foreach循环,因此我执行了以下操作:

    int bound = matrix.size - 1;
    
    for (int[] row : matrix) {
        for (int theint : row) {
            //get current position; price of foreach
            cury = matrix.indexOf(row);
            curx = row.indexOf(theint);
    
            //verify that we're above swap line
            if (cury + curx < bound) {
                //calculate reflected position
                def newx = bound - curx;
                def newy = bound - cury;
    
                //do swap
                def tmp = matrix[newx][newy];
                matrix[newx][newy] = matrix[cury][curx];
                matrix[cury][curx] = tmp;
            }
        }    
    }
    

    不知道为什么,但我觉得这比使用i、j、k等的答案更清楚。不过,我相信@codaptict的答案是有效的。