package mikera.matrixx;
import mikera.matrixx.impl.APrimitiveMatrix;
import mikera.vectorz.Vector1;
import mikera.vectorz.util.ErrorMessages;
/**
* Optimised 1x1 matrix implementation
* @author Mike
*
*/
public final class Matrix11 extends APrimitiveMatrix {
private static final long serialVersionUID = -1961422159148368299L;
private double value;
public Matrix11() {
this(0);
}
public Matrix11(double value) {
this.value=value;
}
public Matrix11(AMatrix m) {
this.value=m.unsafeGet(0, 0);
}
@Override
public int rowCount() {
return 1;
}
@Override
public int columnCount() {
return 1;
}
@Override
public int checkSquare() {
return 1;
}
@Override
public double determinant() {
return value;
}
@Override
public double elementSum() {
return value;
}
@Override
public double elementMax(){
return value;
}
@Override
public double elementMin(){
return value;
}
@Override
public double elementSquaredSum() {
return value*value;
}
@Override
public long nonZeroCount() {
return (value==0)?0:1;
}
@Override
public long elementCount() {
return 1;
}
@Override
public boolean isDiagonal() {
return true;
}
@Override
public boolean isZero() {
return value==0;
}
@Override
public boolean isIdentity() {
return value==1.0;
}
@Override
public Matrix11 inverse() {
if (value==0.0) return null;
return new Matrix11(1.0/value);
}
@Override
public double trace() {
return value;
}
@Override
public double get(int row, int column) {
if ((row!=0)||(column!=0)) throw new IndexOutOfBoundsException(ErrorMessages.invalidIndex(this, row,column));
return value;
}
@Override
public void set(int row, int column, double value) {
if ((row!=0)||(column!=0)) throw new IndexOutOfBoundsException(ErrorMessages.invalidIndex(this, row,column));
this.value=value;
}
@Override
public void addAt(int i, int j, double value) {
this.value+=value;
}
@Override
public void multiply(double factor) {
value*=factor;
}
@Override
public Vector1 getRowClone(int row) {
switch (row) {
case 0: return Vector1.of(value);
default: throw new IndexOutOfBoundsException(ErrorMessages.invalidSlice(this, row));
}
}
@Override
public Vector1 getColumnClone(int column) {
switch (column) {
case 0: return Vector1.of(value);
default: throw new IndexOutOfBoundsException(ErrorMessages.invalidSlice(this, column));
}
}
@Override
public double unsafeGet(int row, int column) {
return value;
}
@Override
public void unsafeSet(int row, int column, double value) {
this.value=value;
}
@Override
public void getElements(double[] data, int offset) {
data[offset]=value;
}
@Override
public void copyRowTo(int row, double[] dest, int destOffset) {
dest[destOffset]=value;
}
@Override
public void copyColumnTo(int col, double[] dest, int destOffset) {
dest[destOffset]=value;
}
@Override
public AMatrix exactClone() {
return new Matrix11(value);
}
@Override
public boolean equalsArray(double[] data, int offset) {
return data[offset]==value;
}
@Override
public double[] toDoubleArray() {
return new double[] {value};
}
}