2017-10-31 10 views
0

私のコードで問題の原因を見つけようとしています。 FDCTHorizontalは2D配列内のすべての数値を変換し、IDCTHorizontalはそれらを変換する必要があります。2D配列の数値演算が1つ多いと、2D配列内の値が正しくありません

メソッドは、各メソッドの内部で同じ要素に対して1つの数学演算が行われた場合にのみ機能します。 2つの操作が行われた場合、返された2D配列IDCTHorizontalは、FDCTHorizontalと同じではありません。

引数differences 2次元配列の行をrepresenetsします。引数YXは出力行の値を表します。

両方の方法で2つ以上の数学演算を使用できないのはなぜですか?

コード:

public static void FDCTHorizontal(ref int[] differences, ref int[] Y) 
{ 
    for (int j = 0; j < differences.Length; j += 8) //split by 8 
    { 
     double[] X = new double[8]; 

     int indexCounter = 0; 
     for (int _ = j; _ < j + 8; _++) 
     { 
      X[indexCounter] = differences[_]; 
      indexCounter++; 
     } 

     //1. stage 
     double X0value = X[0]; 
     double X1value = X[1]; 
     double X2value = X[2]; 
     double X3value = X[3]; 
     double X4value = X[4]; 
     double X5value = X[5]; 
     double X6value = X[6]; 
     double X7value = X[7]; 

     //X[0] = X[0] + X7value; //if not commented, value when calling inverse method will not be the same 
     X[7] = -X[7] + X0value; 

     Y[j + 0] = Convert.ToInt32(X[0]); 
     Y[j + 4] = Convert.ToInt32(X[1]); 
     Y[j + 2] = Convert.ToInt32(X[2]); 
     Y[j + 6] = Convert.ToInt32(X[3]); 
     Y[j + 7] = Convert.ToInt32(X[4]); 
     Y[j + 3] = Convert.ToInt32(X[5]); 
     Y[j + 5] = Convert.ToInt32(X[6]); 
     Y[j + 1] = Convert.ToInt32(X[7]); //switched order 
    } 
} 

public static void IDCTHorizontal(ref int[] changedDifferences, ref int[] X) 
{ 
    for (int j = 0; j < changedDifferences.Length; j += 8) 
    { 
     double[] Y = new double[8]; 
     int indexCounter = 0; 
     for (int _ = j; _ < j + 8; _++) 
     { 
      Y[indexCounter] = changedDifferences[_]; 
      Y[indexCounter] = Y[indexCounter]; 
      indexCounter++; 
     } 

     double Y0value = Y[0]; 
     double Y1value = Y[1]; 
     double Y2value = Y[2]; 
     double Y3value = Y[3]; 
     double Y4value = Y[4]; 
     double Y5value = Y[5]; 
     double Y6value = Y[6]; 
     double Y7value = Y[7]; 

     //Y[0] = Y[0] - Y1value; //if not a comment, returned array does not have the right values 
     Y[1] = -Y[1] + Y0value; 

     X[j + 0] = Convert.ToInt32(Y[0]); 
     X[j + 1] = Convert.ToInt32(Y[4]); 
     X[j + 2] = Convert.ToInt32(Y[2]); 
     X[j + 3] = Convert.ToInt32(Y[6]); 
     X[j + 4] = Convert.ToInt32(Y[7]); 
     X[j + 5] = Convert.ToInt32(Y[3]); 
     X[j + 6] = Convert.ToInt32(Y[5]); 
     X[j + 7] = Convert.ToInt32(Y[1]); 
    } 
} 
+0

'IDCTHorizo​​ntal'の最初のループで' Y [indexCounter] = Y [indexCounter]; 'が怪しいです。 – InBetween

答えて

0

個別にごアルゴリズムの正しさの、あなたは大きな問題を持っている:あなたは、両方のtranformationsでバンカーの丸めを行っています。

次の変換がf(x) = x + 1.5と反対の場合は、g(x) = x - 1.5と仮定してください。両方の変換を適用することは明らかにnoop:g(f(x)) = x + 1.5 - 1.5 = xです。我々はそれに丸め追加した場合

ただし、動作が変更されます。

f´(x) = BankersRound(x + 1.5) 
g´(x) = BankersRound(x - 1.5) 

x = 3 
f´(3) = BankersRound(4.5) = 4 //round to the nearest even number 
g´(f(3)) = BankersRound(4 - 1.5) = BankersRound(2.5) = 2 //round to the nearest even number 

UPDATE:OK、これは問題ではない、なぜならRufusLが正しく指摘するように、あなただけのように丸め加算と減算を実行していますこの特定の場合には問題ではありません。しかし、これは明らかに疑問を抱きます。なぜあなたはdouble配列を使って始めていますか?整数を加算したり減算したりする場合は、intの配列を使用してください! (または中間操作で潜在的なオーバーフローが予想される場合はlong)。

+0

これは理にかなっていますが、両方のメソッドへの入力が整数であり、実行される操作は加算と減算だけなので、丸めがこれらの "全体"の数値にどのように影響するか説明できますか? –

+0

@RufusL笑、良い点、私はアルゴリズムをチェックすべきだった!私は答えを残して、それは傷つくことはありません。 – InBetween

関連する問題