0

I'm trying to implement a non-uniform quantizer with N-level of quantization. I have already done some work and it works, the problem is it goes into infinite loop when N(the number of levels) exceeds "4".

If anyone can point out any hints to know where the wrong is, I'd appreciate it.

public static Vector<Integer> split(Vector <Integer> image,float average,int n)
{

float lowerAverage = average - 1;
float upperAverage = average + 1;
Vector<Float> averages = new Vector<Float>();
Vector <Integer> leftData = new Vector <Integer>();
Vector <Integer> rightData = new Vector <Integer>();
averages.add(lowerAverage);
averages.add(upperAverage);

//FIND ALL AVERAGES
    while (averages.size()<n)
    {
       //I THINK THE PROBLEM HAPPENS HERE AS IT KEEP PRINTING "loop"
        System.out.println("loop");
        for (int i = 0; i < image.size(); i++) 
        {
            if (Math.abs(image.get(i)-lowerAverage) <= Math.abs(image.get(i)-upperAverage))
            {
                leftData.add(image.get(i));

            }
            else
            {
                rightData.add(image.get(i));
            }

        }
        lowerAverage = average(leftData) - 1;
        upperAverage = average (leftData) + 1;

        averages.removeAllElements();
        averages.add(lowerAverage);
        averages.add(upperAverage);

        lowerAverage = average(rightData) - 1;
        upperAverage = average (rightData) + 1;
        averages.add(lowerAverage);
        averages.add(upperAverage);
    }
//*****************************************************************************************
//CREATE DATASETS WITH NUMBER == AVERAGES.SIZE()
    Vector <DataSet> v = new Vector <DataSet>();
    for (int i = 0; i < averages.size(); i++) {
        DataSet temp = new DataSet();
        temp.setName(averages.get(i));
        v.add(temp);
    }
//*****************************************************************************************
//SPLIT ORIGINAL DATA ACCORDING TO AVERAGES
    float name;
    for (int i = 0; i < image.size(); i++) 
    {
        float min =Math.abs(image.get(i)-averages.get(0));
        name = averages.get(0);
        for (int j = 1; j < averages.size(); j++) 
        {
            if (Math.abs(image.get(i)-averages.get(j)) < min)
                    {
                        min = Math.abs(image.get(i)-averages.get(j));
                        name = averages.get(j);
                    }
        }
        getDataset(v, name).addData(image.get(i));

    }
//*****************************************************************************************
//CALCULATE EACH DATASET AVERAGE
    for (int i = 0; i < v.size(); i++) 
    {
        v.get(i).UpdateAverage();

    }
//*****************************************************************************************
//THIS IS JUST FOR TESTING
Vector<Integer> Qinv = new Vector<Integer>();
for (int i = 0; i < v.size(); i++) 
{
    Qinv.add(v.get(i).getAverage());
}


return Qinv;


}
Hossam Houssien
  • 359
  • 4
  • 14
  • You are always adding 4 elements to averages (lowerAverage and upperAverage twice each) after removing all elements, so averages.size() will always be 4. So, if n > 4 the loop will run forever. – samgak Dec 07 '16 at 20:20
  • 1
    (OT - stop using Vector, use the equiv ArrayList in the same package. Vector is synchronized, each operation will cause an extra type to lock and then unlock the object. It will be horrendous in terms of performance for a large number of operations) – Adrian Colomitchi Dec 07 '16 at 22:11

0 Answers0