2011-05-06 8 views
1

この質問には が尋ねられているのか、おそらく既に回答済みかわかりません。私は で元3x3の行列を開始した場合: は行列を斜めに反映しています

 
    1 2 3 
    4 5 6 
    7 8 9 

、私は以下の3×3行列を生成する方法:

 
    9 6 3 
    8 5 2 
    7 4 1 

+0

マトリックス転置を意味しますか? (もしそうなら、私の答えはそれを行います)あなたは対角線は同じであると言いますが、あなたの例はそうではないと言います。 – Pepe

+1

メイン対角線は、左上から右下にかけてのものです。主対角線の周りの「反射」はマトリックスの移動と呼ばれます。あなたが反射している対角線(左下から右上に向かっているもの)は、_antidiagonal_または_secondary diagonal_と呼ばれます。 –

答えて

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)の反例を手作業ではなくコンピュータを使って作成しているので、二次対角について移調しています。私はそれを反映する必要があったので、私のテストアルゴリズムはひどく生産された行列を見つけ出すでしょう。ありがとう! –

+0

これがあなたの質問に答えた場合は、その答えの隣にあるチェックマークをクリックしてください。これは「回答を受け入れる」と呼ばれ、StackOverflowでここで「ありがとう」と言います。ああ、ようこそ。 –

+0

@ Steve314:そうです。申し訳ありませんが、混乱しました。 –

3

は、マトリックス内のアイテムのペアは、スワップされるので、(ループ内の)「何か」はスワップ操作になります。スワップするアイテムを選択するためにループが使用され、スワップするアイテムを選択するために基本的な算術演算が使用されます。ループは、反射軸上のものとその反対側のものを除いて、軸の片側にあるアイテムの三角形の周りを反復して、周りを反射する必要があります。それを視覚化するには...

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

アスタリスクは、スワップの最初のパラメータとして使用する項目です。ドットは、スワップの第2パラメータとして使用する項目です。スラッシュは反射軸上にあります。 3×3行列で

ので...

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]); 
    } 
} 

、ループは少し過剰にある - 彼らは、原則のためにここで示されており、それを拡張する方法を示すこと。必要に応じてその可視化で唯一の3アスタリスク、そして3つだけスワップ操作... N * Nの正方行列の場合

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

+0

です@Bugaboo - 愚かな間違いです。私の元のループは二次対角線の周りで必要な反射ではなく、大対角の周りに転置を実装します。答えの歴史を見て、私は誰かに、elsesの答えが、どの操作が実装されているのか混乱していると言いました。 – Steve314

2

あります

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)') 
関連する問題