Scala:头发小波变换

Scala: Haar Wavelet Transform

我正在尝试在 Scala 中实现 Haar 小波变换。我正在使用此 Python 代码供参考 Github Link to Python implementation of HWT

我也在这里提供我的 Scala 代码版本。我是 Scala 的新手,所以请原谅我的代码不太好。

/**
  * 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
}
}

但是代码卡在 "var deltas1 = encode(samples(i), ubound)" 并且没有给出任何输出。我怎样才能改进我的实施?提前致谢!

你的错误在这一行:

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

这不会从列表中删除索引 0。它删除元素 1(如果存在)。这意味着列表永远不会变空。 while 循环 while (lst.nonEmpty) 因此永远不会终止。

要删除列表的第一个元素,只需使用 lst.remove(0)