2017-01-11 3 views
0

Ich versuche Haar Wavelet Transformation in Scala zu implementieren. Ich verwende diesen Python-Code als Referenz Github Link to Python implementation of HWTScala: Haar Wavelet Transform

Ich gebe auch hier meine Scala-Code-Version. Ich bin neu in Scala, also verzeih mir, dass ich nicht so gut bin.

/** 
    * Created by vipul vaibhaw on 1/11/2017. 
    */ 

import scala.collection.mutable.{ListBuffer, MutableList,ArrayBuffer} 

object HaarWavelet { 

def main(args: Array[String]): Unit = { 

    var samples = ListBuffer(
    ListBuffer(1,4), 
    ListBuffer(6,1), 
    ListBuffer(0,2,4,6,7,7,7,7), 
    ListBuffer(1,2,3,4), 
    ListBuffer(7,5,1,6,3,0,2,4), 
ListBuffer(3,2,3,7,5,5,1,1,0,2,5,1,2,0,1,2,0,2,1,0,0,2,1,2,0,2,1,0,0,2,1,2) 
) 

for (i <- 0 to samples.length){ 
    var ubound = samples(i).max+1 
    var length = samples(i).length 
    var deltas1 = encode(samples(i), ubound) 
    var deltas = deltas1._1 
    var avg = deltas1._2 


    println("Input:  %s, boundary = %s, length = %s" format(samples(i), ubound, length)) 
    println("Haar output:%s, average = %s" format(deltas, avg)) 
    println("Decoded: %s" format(decode(deltas, avg, ubound))) 
    } 
} 

def wrap(value:Int, ubound:Int):Int = { 
(value+ubound)%ubound 
} 

def encode(lst1:ListBuffer[Int], ubound:Int):(ListBuffer[Int],Int)={ 
    //var lst = ListBuffer[Int]() 
    //lst1.foreach(x=>lst+=x) 
    var lst = lst1 
    var deltas = new ListBuffer[Int]() 
    var avg = 0 

    while (lst.length>=2) { 
    var avgs = new ListBuffer[Int]() 

    while (lst.nonEmpty) { 
    // getting first two element from the list and removing them 
    val a = lst.head 
    lst -= 1 // removing index 0 element from the list 
    val b = lst.head 
    lst -= 1 // removing index 0 element from the list 

    if (a<=b) { 
     avg = (a + b)/2 
    } 
    else{ 
     avg = (a+b+ubound)/2 
    } 
    var delta = wrap(b-a,ubound) 
    avgs += avg 
    deltas += delta 
    } 
    lst = avgs 
} 
(deltas, avg%ubound) 
} 

def decode(deltas:ListBuffer[Int],avg:Int,ubound:Int):ListBuffer[Int]={ 
var avgs = ListBuffer[Int](avg) 
var l = 1 

while(deltas.nonEmpty){ 
    for(i <- 0 to l){ 
    val delta = deltas.last 
    deltas -= -1 
    val avg = avgs.last 
    avgs -= -1 

    val a = wrap(math.ceil(avg-delta/2.0).toInt,ubound) 
    val b = wrap(math.ceil(avg+delta/2.0).toInt,ubound) 
    } 
    l*=2 
} 
avgs 
} 

def is_pow2(n:Int):Boolean={ 
(n & -n) == n 
} 
} 

Aber Code wird bei "var deltas1 = kodieren (Proben (i), ubound)" fest und gibt keine Ausgabe. Wie kann ich meine Implementierung verbessern? Danke im Voraus!

+0

Bitte geben Sie uns den Fehler, den Sie bekommen. – marstran

+0

@marstran Hey! Ich habe den Fehler losgeworden, jetzt gibt mein Code keinen Fehler, aber er bleibt bei "var deltas1 = encode (samples (i), ubound)" hängen und gibt keine Ausgabe aus. –

+0

Was meinst du mit "hängt fest"? Hast du eine Endlosschleife? – marstran

Antwort

0

Ihr Fehler ist auf dieser Linie:

lst -= 1 // removing index 0 element from the list. 

Diesen nicht Index 0 aus der Liste entfernen. Es entfernt das Element 1 (falls es existiert). Dies bedeutet, dass die Liste niemals leer wird. Die While-Schleife while (lst.nonEmpty) wird daher niemals beendet.

Um das erste Element der Liste zu entfernen, verwenden Sie einfach lst.remove(0).

+0

Danke! So dumm von mir! +1 –

Verwandte Themen