加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

“去隔行”Scala中的列表

发布时间:2020-12-16 19:01:09 所属栏目:安全 来源:网络整理
导读:我有一个表示从音频接口读入的原始样本的字节列表.根据用例和H / W,每个样本可以在1到4个字节长的任何地方,“流”中的通道总数可以或多或少是任意的.每个采样的通道和位数量在运行时都是已知的. 我举一个例子说明我的意思.流中有四个通道,每个样本都是两个字
我有一个表示从音频接口读入的原始样本的字节列表.根据用例和H / W,每个样本可以在1到4个字节长的任何地方,“流”中的通道总数可以或多或少是任意的.每个采样的通道和位数量在运行时都是已知的.

我举一个例子说明我的意思.流中有四个通道,每个样本都是两个字节.

列表(A1,A2,B1,B2,C1,C2,D1,D2,A3,A4,B3,B4,C3,C4,D3,D4)

所以A1是通道A的第一个采样的第一个字节,A2是相同采样的第二个字节,依此类推.

我需要做的是将每个频道的样本提取到自己的列表中,如下所示:

列表(列表(A1,A4),列表(B1,B4),列表(C1,C4),列表(D1,D4))

在惯用的Scala中我该怎么做?我刚刚在几个小时前开始学习Scala,而我提出的唯一非必要的解决方案显然是非最优的:

def uninterleave(samples: Array[Byte],numChannels: Int,bytesPerSample: Int) = {
val dropAmount = numChannels * bytesPerSample
  def extractChannel(n: Int) = {
    def extrInner(in: Seq[Byte],acc: Seq[Byte]): Seq[Byte] = {
      if(in == List()) acc
      else extrInner(in.drop(dropAmount),in.take(bytesPerSample) ++ acc)
    }
    extrInner(samples.drop(n * bytesPerSample),Nil)
  }

  for(i <- 0 until numChannels) yield extractChannel(i)
}

解决方法

我会做

samples.grouped(bytesPerSample).grouped(numChannels).toList
  .transpose.map(_.flatten)

我不会保证其表现.我宁愿避免列表,不幸的是分组生成它们.

也许

samples.grouped(bytesPerSample).map(_.toArray)
  .grouped(numChannels).map(_.toArray)
  .toArray
  .transpose
  .map(flatten)

还是很多的清单.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读