对角线反射矩阵

时间:2011-05-06 20:43:40

标签: c++

我不确定是否已经问过这个问题 或者很可能已经回答过了。如果我开始 一个原始的3x3矩阵:

    1 2 3
    4 5 6
    7 8 9

,我将如何生成以下3x3矩阵:

    9 6 3
    8 5 2
    7 4 1 

...

4 个答案:

答案 0 :(得分:3)

由于你试图反映二级对角线(那不是换位),这里是代码,一个稍微修改过的Peter的副本:

for (int i = 0; i < n; i++)
{
    for (int j = 0; j < i; j++)
    {
        int temp = a[i][j];
        a[i][j] = a[n - 1 - j][n - 1 - i];
        a[n - 1 - j][n - 1 - i] = temp;
    } 
}

答案 1 :(得分:3)

对于反射,矩阵中的项对被交换,因此“做某事”(在循环内)将是交换操作。循环将用于选择要交换的项目,并使用一些基本算法来选择要与之交换的项目。循环应迭代在轴的一侧的项目的三角形上以反射,不包括在反射轴上和在其另一侧的那些。想象一下......

  0 1 2
0 * * /
1 * / .
2 / . .

星号是用作交换的第一个参数的项目。点是用作交换的第二个参数的项目。斜杠位于反射轴上。

...因此

for (int i = 0; i < 2; i++)
{
  for (int j = 0; j < (n-1)-i; j++)  //  Thanks to Bugaboo for bugfix
  {
    std::swap (a[i][j], a[2-j][2-i]);
  }
}

使用3x3矩阵时,循环有点过分 - 这里显示了原理,并展示了如何扩展它。该可视化中只有三个星号,只需要三个交换操作......

std::swap (a[0][0], a[2][2]);
std::swap (a[0][1], a[1][2]);
std::swap (a[1][0], a[2][1]);

答案 2 :(得分:2)

对于N * N方阵:

    for(int i=0;i<n-1;i++)
      for(int j=0;j<n-1-i;j++) //Swap elements above anti-diagonal 
           std::swap(mat[i][j],mat[n-1-j][n-1-i]);  //with elements below it

答案 3 :(得分:0)

我想我在MatLab中找到了一种方法,它结合了一系列其他现有的翻转方法。

  1. fliplr(向左和向右翻转)
  2. fliplr
  3. Ham是目标,然后代码如下 也许这是错的,但请告诉我。

    fliplr(fliplr(Ham)')