package mikera.vectorz.impl;
import mikera.vectorz.AVector;
import mikera.vectorz.Op;
/**
* Mutable strided vector class
* @author Mike
*
*/
public final class StridedVector extends BaseStridedVector {
private static final long serialVersionUID = 5807998427323932401L;
private StridedVector(double[] data, int offset, int length, int stride) {
super(length,data,offset,stride);
}
/**
* Wraps a StridedVector around a strided range of a double[] array.
*
* Performs no bounds checking.
* @param data
* @param offset
* @param length
* @param stride
* @return
*/
public static StridedVector wrap(double[] data, int offset, int length, int stride) {
return new StridedVector(data,offset,length,stride);
}
@Override
public void set(int i, double value) {
checkIndex(i);
data[offset+i*stride]=value;
}
@Override
public void unsafeSet(int i, double value) {
data[offset+i*stride]=value;
}
@Override
public void addAt(int i, double value) {
data[offset+i*stride]+=value;
}
@Override
public void add(double[] data, int offset) {
int stride=getStride();
double[] tdata=getArray();
int toffset=getArrayOffset();
int length=length();
for (int i = 0; i < length; i++) {
tdata[toffset+i*stride]+=data[offset+i];
}
}
@Override
public void add(AVector v) {
v.checkLength(length());
v.addToArray(getArray(), getArrayOffset(),getStride());
}
@Override
public void add(int offset, AVector a,int srcOffset, int length) {
int stride=getStride();
a.subVector(srcOffset,length).addToArray(getArray(), getArrayOffset()+offset*stride,stride);
}
@Override
public void applyOp(Op op) {
op.applyTo(data, offset, stride, length);
}
@Override
public void set(AVector v) {
int length=checkSameLength(v);
v.copyTo(0, data, offset, length, stride);
}
@Override
public void clamp(double min, double max) {
for (int i = 0; i < length; i++) {
int ix=offset+i*stride;
double v=data[ix];
if (vmax) {
data[ix]=max;
}
}
}
@Override
public void fill(double value) {
int di=offset;
for (int i=0; i
Ads help maintain this website.