package mikera.vectorz.impl;
import java.util.Iterator;
import mikera.arrayz.Arrayz;
import mikera.arrayz.INDArray;
import mikera.arrayz.impl.IStridedArray;
import mikera.matrixx.AMatrix;
import mikera.matrixx.Matrixx;
import mikera.matrixx.impl.AStridedMatrix;
import mikera.matrixx.impl.StridedMatrix;
import mikera.vectorz.AVector;
import mikera.vectorz.Op;
import mikera.vectorz.Op2;
import mikera.vectorz.Vector;
import mikera.vectorz.Vectorz;
import mikera.vectorz.util.DoubleArrays;
import mikera.vectorz.util.ErrorMessages;
import mikera.vectorz.util.VectorzException;
/**
* Abstract base class for vectors backed by a double[] array with a constant stride
*
* The double array can be directly accessed for performance purposes
*
* @author Mike
*/
public abstract class AStridedVector extends AArrayVector implements IStridedArray {
protected AStridedVector(int length, double[] data) {
super(length,data);
}
private static final long serialVersionUID = -7239429584755803950L;
/**
* Gets the underlying double[] data array for this vector
*/
@Override
public final double[] getArray() {
return data;
}
/**
* Gets the offset into the underlying double[] data array for the first element of this vector
*/
@Override
public abstract int getArrayOffset();
/**
* Gets the stride of this strided vector.
* @return
*/
public abstract int getStride();
@Override
public AStridedVector ensureMutable() {
if (isFullyMutable()) return this;
return clone();
}
@Override
public boolean isRangeZero(int start, int length) {
int stride=getStride();
int offset=getArrayOffset()+start*stride;
return DoubleArrays.isZero(data, offset, length,stride);
}
@Override public double dotProduct(double[] data, int offset) {
return DoubleArrays.dotProduct(data,offset,getArray(), getArrayOffset(), getStride(), length());
}
@Override
public double dotProduct(AVector v) {
checkLength(v.length());
return v.dotProduct(getArray(), getArrayOffset(), getStride());
}
@Override
public double elementSum() {
return DoubleArrays.elementSum(getArray(), getArrayOffset(), getStride(), length());
}
@Override
public double elementProduct() {
int len=length();
double[] array=getArray();
int offset=getArrayOffset();
int stride=getStride();
double result=1.0;
for (int i=0; imax) max=d;
}
return max;
}
@Override
public double elementMin(){
int len=length();
double[] array=getArray();
int offset=getArrayOffset();
int stride=getStride();
double min = Double.MAX_VALUE;
for (int i=0; i iterator() {
return new StridedElementIterator(getArray(),getArrayOffset(),length(),getStride());
}
@Override
public int getStride(int dimension) {
if (dimension!=0) throw new IllegalArgumentException(ErrorMessages.invalidDimension(this, dimension));
return getStride();
}
@Override
public double elementSquaredSum() {
return DoubleArrays.elementSquaredSum(data, getArrayOffset(), length,getStride());
}
@Override
public void getElements(double[] dest, int destOffset) {
int offset=getArrayOffset();
int stride=getStride();
for (int i=0; i0) {
int offset=getArrayOffset();
if ((offset<0)||(offset>=data.length)) throw new VectorzException("offset out of bounds: "+offset);
int lastIndex=offset+(getStride()*(length-1));
if ((lastIndex<0)||(lastIndex>=data.length)) throw new VectorzException("lastIndex out of bounds: "+lastIndex);
}
super.validate();
}
}
Ads help maintain this website.