2011-05-06 266 views
1

我不確定這個問題是否已被要求 或很可能已經回答。如果我開始 原來的3x3矩陣:對角線反映矩陣

 
    1 2 3 
    4 5 6 
    7 8 9 

,我怎麼會產生以下3x3矩陣:

 
    9 6 3 
    8 5 2 
    7 4 1 

+0

您的意思是矩陣轉置? (如果是這樣,那麼我的答案就是這樣)你說對角線保持不變,但你的例子顯示不然。 – Pepe 2011-05-06 20:50:31

+1

主對角線是從左上角到右下角的對角線。圍繞主對角線的「反射」稱爲_transposing_矩陣。您反映的對角線(從左下角到右上角)被稱爲_antidiagonal_或_secondary對角線_。 – 2011-05-06 20:50:38

回答

3

既然你想反映關於次對角線(這不是換位),這裏的代碼,彼得稍加修改的副本:

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

非常感謝;因爲我正在使用計算機而不是手工創建一個13x13 Ramsey Number R(4,4)計數器示例,所以我轉置了次對角線;我需要反思它,所以我的測試算法會查出產生不良的矩陣。謝謝! – 2011-05-06 21:06:18

+0

如果這回答您的問題,請單擊答案旁邊的複選標記。這被稱爲「接受答案」,這就是我們在StackOverflow中如何說「謝謝」。哦,歡迎來到SO。 – 2011-05-06 21:08:13

+0

@ Steve314:你說得對。對不起,搞砸了。 – 2011-05-06 21:38:56

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]); 
+1

用你的代碼,你甚至可以如何獲得A [0] [0]?由於'j'總是小於'i',所以它們兩個永遠不可能同時相等。 'j'的正確限制是j Bugaboo 2017-05-25 01:26:06

+0

@Bugaboo - 一個愚蠢的錯誤 - 我的原始循環將圍繞主對角線執行轉置,而不是圍繞次對角線所需的反射。回顧一下答案的歷史,我甚至提到某人對其執行的操作感到困惑 - 哎呀。 – Steve314 2017-05-25 12:24:44

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 
0

我想我找到了一種方法在MATLAB是結合了一系列其他現有的翻轉方法。

  1. fliplr(翻轉左和右)
  2. 移調
  3. fliplr

Ham是目標則代碼如下。
也許這是錯的,但讓我知道。

fliplr(fliplr(Ham)')