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
问题原因说明
intoArray带mask参数的行为:该方法会按照原向量的元素位置写入结果数组,mask为false的位置会填充类型默认值(Double的0.0),因此会产生间隙,无法实现无间隙插入。- 之前
selectFrom越界的原因:大概率是未预先计算并分配足够的结果数组空间,或者错误使用了原向量的长度而非筛选后向量的长度来操作索引。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

