私のコードで問題の原因を見つけようとしています。 FDCTHorizontal
は2D配列内のすべての数値を変換し、IDCTHorizontal
はそれらを変換する必要があります。2D配列の数値演算が1つ多いと、2D配列内の値が正しくありません
メソッドは、各メソッドの内部で同じ要素に対して1つの数学演算が行われた場合にのみ機能します。 2つの操作が行われた場合、返された2D配列IDCTHorizontal
は、FDCTHorizontal
と同じではありません。
引数differences
2次元配列の行をrepresenetsします。引数Y
とX
は出力行の値を表します。
両方の方法で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]);
}
}
'IDCTHorizontal'の最初のループで' Y [indexCounter] = Y [indexCounter]; 'が怪しいです。 – InBetween