में डीसीटी और आईडीसीटी एल्गोरिदम के साथ समस्याएं यहां मेरे पास "applyDCT" और "applyIDCT" विधियों के साथ मेरा डीसीटी एल्गोरिदम क्लास है। 0 और 255 के बीच यादृच्छिक पूर्णांक की 2x2 तालिका पर आगे डीसीटी (असतत कोसाइन ट्रांसफॉर्म) करने के बाद तकनीकी रूप से, और फिर इन नंबरों पर तुरंत एक रिवर्स डीसीटी कर रहे हैं, हमें पहले मूलभूत पूर्णांक संख्याओं पर वापस आना चाहिए। मेरे मामले में, ऐसा नहीं है। मुझसे यहां क्या गलत हो रहा है?जावा
public class Main {
private static final int N = 2;
private static double[][] f = new double[N][N];
private static Random generator = new Random();
public static void main(String[] args) {
// Generate random integers between 0 and 255
int value;
for (int x=0;x<N;x++) {
for (int y=0;y<N;y++) {
value = generator.nextInt(255);
f[x][y] = value;
System.out.println(f[x][y]+" => f["+x+"]["+y+"]");
}
}
DCT dctApplied = new DCT();
double[][] F = dctApplied.applyDCT(f);
System.out.println("From f to F");
System.out.println("-----------");
for (int x=0;x<N;x++) {
for (int y=0;y<N;y++) {
try {
System.out.println(F[x][y]+" => F["+x+"]["+y+"]");
} catch (Exception e) {
System.out.println(e);
}
}
}
double f[][] = dctApplied.applyIDCT(F);
System.out.println("Back to f");
System.out.println("---------");
for (int y=0;y<N;y++) {
for (int z=0;z<N;z++) {
System.out.println(f[y][z]+" => f["+y+"]["+z+"]");
}
}
}
}
यहाँ परिणामों के उदाहरण हैं::
public class DCT {
private static final int N = 2;
private double[] c = new double[N];
public DCT() {
this.initializeCoefficients();
}
private void initializeCoefficients() {
for (int i=1;i<N;i++) {
c[i]=1;
}
c[0]=1/Math.sqrt(2.0);
}
public double[][] applyDCT(double[][] f) {
double[][] F = new double[N][N];
for (int u=0;u<N;u++) {
for (int v=0;v<N;v++) {
double sum = 0.0;
for (int i=0;i<N;i++) {
for (int j=0;j<N;j++) {
sum+=Math.cos(((2*i+1)/(2.0*N))*u*Math.PI)*Math.cos(((2*j+1)/(2.0*N))*v*Math.PI)*f[i][j];
}
}
sum*=((c[u]*c[v])/4.0);
F[u][v]=sum;
}
}
return F;
}
public double[][] applyIDCT(double[][] F) {
double[][] f = new double[N][N];
for (int u=0;u<N;u++) {
for (int v=0;v<N;v++) {
double sum = 0.0;
for (int i=0;i<N;i++) {
for (int j=0;j<N;j++) {
sum+=((c[u]*c[v]))*Math.cos(((2*i+1)/(2.0*N))*u*Math.PI)*Math.cos(((2*j+1)/(2.0*N))*v*Math.PI)*F[i][j];
}
}
sum/=4.0;
//sum*=((c[u]*c[v])/4.0);
f[u][v]=sum;
}
}
return f;
}
}
और यहाँ मुख्य वर्ग है कि यह साथ चला जाता है
149.0 => f[0][0]
237.0 => f[0][1]
122.0 => f[1][0]
147.0 => f[1][1]
From f to F
-----------
81.87499999999999 => F[0][0]
-14.124999999999993 => F[0][1]
14.62500000000001 => F[1][0]
-7.875 => F[1][1]
Back to f
---------
9.3125 => f[0][0]
14.812499999999998 => f[0][1]
7.624999999999999 => f[1][0]
9.187499999999998 => f[1][1]
ऊपर दिखाया गया है, "च वापस" प्रदर्शित नहीं करता है शुरुआती एफ में निहित वही मान ...
क्या इनपुट मामला था, अपेक्षित परिणाम है, और क्या वास्तविक परिणाम था क्या? क्या आपने यह पता लगाने के लिए कि कौन सा गलत था, आप अपने प्रत्येक दिनचर्या को छोटे इनपुट मामलों (जैसे [1 0; 0 0]) पर चलाने का प्रयास करते थे? –
जब आप कहते हैं कि आपको अपने मूल पूर्णांक वापस नहीं मिलते हैं तो आपको क्या परिणाम मिलते हैं? कुछ फ़्लोटिंग पॉइंट राउंडिंग त्रुटियों को पेश किया जा सकता है। – rsp
डीसीटी खुद ही हानिकारक है। लापरवाही (उलटा) ऑपरेशन पाने के लिए आपको संशोधित डीसीटी (लापरवाह डीसीटी) की आवश्यकता है। – osgx