You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java SIMD DoubleVector筛选值无间隙插入数组的标准实现方法

无间隙插入DoubleVector筛选值到数组的标准实现

问题背景

需要从DoubleVector中筛选符合条件的值,无间隙插入结果数组,但现有实现遇到两个问题:

  • 使用vals.intoArray(newVec, j, mask)时,符合条件的值前会插入false对应的0.0,导致结果数组出现间隙
  • 尝试vals.selectFrom(vals, mask)时触发数组越界异常

标准实现方式

正确的做法是先通过selectFrom得到仅包含符合条件元素的新向量,再将该向量完整写入结果数组,而非使用带mask参数的intoArray。关键是确保结果数组的空间足够,且按筛选后向量的实际长度更新索引。

修正后的代码示例

val sp = Matrix.doubleSpecies
val l = sp.length()
val vec: Array[Double] = ???
val index: Array[Boolean] = ???
var i = 0
var j = 0

// 预先计算结果数组的总长度,避免动态扩容
val totalSelected = index.count(_ == true)
val newVec = new Array[Double](totalSelected)

while i < sp.loopBound(vec.length) do
  val mask = VectorMask.fromArray[java.lang.Double](sp, index, i)
  val vals = DoubleVector.fromArray(sp, vec, i)
  
  // 筛选出符合mask条件的元素,得到紧凑的新向量
  val selectedVals = vals.selectFrom(vals, mask)
  
  // 将筛选后的向量无间隙写入结果数组的j位置
  selectedVals.intoArray(newVec, j)
  
  // 更新循环索引:i按向量批次长度前进,j按筛选出的元素数量前进
  i += l
  j += selectedVals.length()
end while

问题原因说明

  1. intoArray带mask参数的行为:该方法会按照原向量的元素位置写入结果数组,mask为false的位置会填充类型默认值(Double的0.0),因此会产生间隙,无法实现无间隙插入。
  2. 之前selectFrom越界的原因:大概率是未预先计算并分配足够的结果数组空间,或者错误使用了原向量的长度而非筛选后向量的长度来操作索引。

内容的提问来源于stack exchange,提问作者Simon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 02:32:34