package mikera.vectorz.impl;
import java.util.Arrays;
import mikera.vectorz.AVector;
import mikera.vectorz.util.ErrorMessages;
import mikera.vectorz.util.IntArrays;
import mikera.vectorz.util.VectorzException;
/**
* Vector that addresses elements indexed into another source vector.
*
* Indexed elements are not necessarily distinct: two elements n the vector can refer to the same source element.
*
* @author Mike
*/
public final class IndexedSubVector extends BaseIndexedVector {
private static final long serialVersionUID = -1411109918028367417L;
private final AVector source;
private IndexedSubVector(AVector source, int[] indexes) {
super(indexes);
this.source=source;
}
public static IndexedSubVector wrap(AVector source, int[] indexes) {
return new IndexedSubVector(source,indexes);
}
@Override
public void addToArray(double[] dest, int offset) {
for (int i=0; ithis.length)) {
throw new IndexOutOfBoundsException(ErrorMessages.invalidRange(this, offset, length));
}
if (length==0) return Vector0.INSTANCE;
if (length==this.length) return this;
int[] newIndexes=Arrays.copyOfRange(indexes, offset, offset+length);
return replaceIndex(newIndexes);
}
@Override
public IndexedSubVector exactClone() {
return IndexedSubVector.wrap(source.exactClone(), indexes.clone());
}
@Override
public void validate() {
super.validate();
int slen=source.length();
for (int i=0; i=slen)) throw new VectorzException("Indexes out of range");
}
}
@Override
public void addAt(int i, double v) {
source.addAt(indexes[i], v);
}
@Override
public double dotProduct(double[] data, int offset) {
double result=0.0;
for (int i=0; i
Ads help maintain this website.