【问题标题】:Calculate reflected matrix计算反射矩阵
【发布时间】:2025-11-22 00:25:02
【问题描述】:

我有以下 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;

                }
            }

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

【问题讨论】:

  • 您有什么具体问题吗?
  • 乍一看,我认为你应该迭代k=0; k&lt;i; k++...

标签: java arrays matrix multidimensional-array


【解决方案1】:

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

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】:

    您可以使用相同矩阵的副本,以便能够将值存储在新矩阵中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】:

      我决定将其视为一个 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 等的更清晰一些……不过,我相信 @codaddict 的答案有效。

      【讨论】: