in flink-ml-lib/src/main/java/org/apache/flink/ml/common/util/VectorUtils.java [34:61]
public static Vector selectByIndices(Vector vector, int[] sortedIndices) {
if (vector instanceof DenseVector) {
DenseVector resultVec = new DenseVector(sortedIndices.length);
for (int i = 0; i < sortedIndices.length; i++) {
resultVec.set(i, vector.get(sortedIndices[i]));
}
return resultVec;
} else {
List<Integer> resultIndices = new ArrayList<>();
List<Double> resultValues = new ArrayList<>();
int[] indices = ((SparseVector) vector).indices;
for (int i = 0, j = 0; i < indices.length && j < sortedIndices.length; ) {
if (indices[i] == sortedIndices[j]) {
resultIndices.add(j++);
resultValues.add(((SparseVector) vector).values[i++]);
} else if (indices[i] > sortedIndices[j]) {
j++;
} else {
i++;
}
}
return new SparseVector(
sortedIndices.length,
resultIndices.stream().mapToInt(Integer::intValue).toArray(),
resultValues.stream().mapToDouble(Double::doubleValue).toArray());
}
}