package mikera.matrixx.impl;
import mikera.arrayz.INDArray;
import mikera.matrixx.AMatrix;
import mikera.vectorz.util.ErrorMessages;
/**
* Abstract class for regular rectangular matrices that maintain a final fixed row and column count.
*
* Most concrete matrix implementations should inherit from this.
*
* @author Mike
*
*/
public abstract class ARectangularMatrix extends AMatrix {
private static final long serialVersionUID = 6429003789294676974L;
protected final int rows;
protected final int cols;
protected ARectangularMatrix(int rows, int cols) {
this.rows=rows;
this.cols=cols;
}
@Override
public final int rowCount() {
return rows;
}
@Override
public final int columnCount() {
return cols;
}
@Override
public final int[] getShape() {
return new int[] {rows,cols};
}
@Override
public final int[] getShapeClone() {
return new int[] {rows,cols};
}
@Override
public int bandLength(int band) {
return bandLength(rows,cols,band);
}
@Override
public final int getShape(int dim) {
if (dim==0) {
return rows;
} else if (dim==1) {
return cols;
} else {
throw new IndexOutOfBoundsException(ErrorMessages.invalidDimension(this, dim));
}
}
@Override
public final boolean isSameShape(INDArray m) {
return (m.dimensionality()==2)&&(rows==m.getShape(0))&&(cols==m.getShape(1));
}
@Override
public int checkSquare() {
int rc=rows;
if (rc!=cols) throw new UnsupportedOperationException(ErrorMessages.nonSquareMatrix(this));
return rc;
}
@Override
protected void checkSameShape(AMatrix m) {
int rc=rowCount();
int cc=columnCount();
if((rc!=m.rowCount())||(cc!=m.columnCount())) {
throw new IndexOutOfBoundsException(ErrorMessages.mismatch(this, m));
}
}
protected int checkColumn(int column) {
int cc=columnCount();
if ((column<0)||(column>=cc)) throw new IndexOutOfBoundsException(ErrorMessages.invalidSlice(this, 1, column));
return cc;
}
protected int checkRow(int row) {
int rc=rowCount();
if ((row<0)||(row>=rc)) throw new IndexOutOfBoundsException(ErrorMessages.invalidSlice(this, 0, row));
return rc;
}
@Override
protected void checkSameShape(ARectangularMatrix m) {
int rc=rowCount();
int cc=columnCount();
if((rc!=m.rowCount())||(cc!=m.columnCount())) {
throw new IndexOutOfBoundsException(ErrorMessages.mismatch(this, m));
}
}
@Override
protected final void checkIndex(int i, int j) {
if ((i<0)||(i>=rows)||(j<0)||(j>=cols)) {
throw new IndexOutOfBoundsException(ErrorMessages.invalidIndex(this, i,j));
}
}
@Override
public final boolean isSameShape(AMatrix m) {
return (rows==m.rowCount())&&(cols==m.columnCount());
}
public final boolean isSameShape(ARectangularMatrix m) {
return (rows==m.rows)&&(cols==m.cols);
}
@Override
public final long elementCount() {
return ((long)rows)*cols;
}
}