我不确定是否已经问过这个问题 或者很可能已经回答过了。如果我开始 一个原始的3x3矩阵:
1 2 3 4 5 6 7 8 9
,我将如何生成以下3x3矩阵:
9 6 3 8 5 2 7 4 1
...
答案 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中找到了一种方法,它结合了一系列其他现有的翻转方法。
Ham
是目标,然后代码如下
也许这是错的,但请告诉我。
fliplr(fliplr(Ham)')