“去隔行”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) 还是很多的清单. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |