2016-12-09 4 views
1

C++で2次元行列nxnを管理するのに問題があります。私の問題は、対角線上に対角線上に平行線が存在するかどうかを制御する関数を作成することです。行と列に必要な2つのインデックスを制御していましたが、それが異なっていれば、要素を逆にするサポート配列を手伝ってもいいかもしれません。おそらく、巨大なマトリックス(8x8,14アレイなど)では良い考えではないので、あなたの助けを求めています。C++での行列2Dの平行対角逆行列を見つける方法

おかげ

an example with matrix 4x4

これは私のコードです:

bool funct(short **M, int rows, int columns){ 
bool found = false; 

for(int i = 0; i < rows; i++){ 
    for(int j = 0; j < colums; j++){ 

     if(i != j){ 
      //control the reverse array 
     } 
    } 
    } 
} 

PS:私の主な問題は、一般的なアルゴリズム(n×nの)です。

+0

行列は常に2次式ですか? Btw、8x8は巨大なものでもありません。 –

+0

はい、私はまだ行列で練習していません。 – Andrew

+0

コントロールの意味は?マトリックスを介して1回の反復でこれらの要素を識別したいのですか、それともそれぞれの配列をそれぞれの配列に入れたいのですか? –

答えて

1

2次行列では、すべての対角には同じ長さの対角線が1つだけあります(主対角を除く)。したがって、これをチェックするだけです:

for(int diagonal = 1; diagonal < cols - 1; ++diagonal) 
{ 
    //inspect the diagonal that starts at (0, diagonal) 
    //the other diagonal starts at (diagonal, 0) 
    int diagonalLength = cols - diagonal; 

    //Assume that this diagonal has a reverse counterpart 
    bool diagonalHasReverse = true; 

    //Now check if it really has 
    for(int i = 0; i < diagonalLength; ++i) 
    { 
     if(M[i][diagonal + i] != 
      M[diagonal + diagonalLength - 1 - i][diagonalLength - 1 - i]) 
     { 
      diagonalHasReverse = false; 
      break; 
     } 
    } 
    //do whatever you want with diagonalHasReverse 
} 

外側ループは最後の(1要素の)対角線を処理しません。それを含める場合は、次のようにループを変更する必要があります。

for(int diagonal = 1; diagonal < cols; ++diagonal) 
+0

対角ではありませんか?

+0

@ Ahmed.Jなぜですか?最後の対角線は単一の要素であり、逆のカウンターパートを持つと考えることもできます。 –

+0

そうだとすれば、イメージ内の2つのハイライトされた対角線のために、最後の要素ではなく、私が言っていたことがあります。 –

関連する問題