package mikera.matrixx.impl;
import mikera.matrixx.Matrix;
/**
* Abstract class for a Matrix backed with a single double[] data array
*
* Dimensions are fixed, but leaves open the possibility of arbitrary indexing
*
* @author Mike
*
*/
public abstract class AArrayMatrix extends ARectangularMatrix {
private static final long serialVersionUID = 7423448070352281717L;
public final double[] data;
protected AArrayMatrix(double[] data, int rows, int cols ) {
super(rows,cols);
this.data=data;
}
public double[] getArray() {
return data;
}
@Override
public double get(int i, int j) {
checkIndex(i,j);
return data[index(i,j)];
}
@Override
public void set(int i, int j,double value) {
checkIndex(i,j);
data[index(i,j)]=value;
}
@Override
public double unsafeGet(int i, int j) {
return data[index(i,j)];
}
@Override
public void unsafeSet(int i, int j,double value) {
data[index(i,j)]=value;
}
/**
* Returns true if the data array is fully packed by this matrix in row-major order
* @return
*/
public abstract boolean isPackedArray();
@Override
public Matrix getTransposeCopy() {
return toMatrixTranspose();
}
/**
* Computes the index into the data array for a given position in the matrix
* @param i
* @param j
* @return
*/
protected abstract int index(int i, int j);
@Override
public boolean hasUncountable() {
int len = data.length;
for(int i=0; i<len; i++) {
if (Double.isNaN(data[i]) || Double.isInfinite(data[i])) {
return true;
}
}
return false;
}
}