package mikera.matrixx.impl;
import mikera.vectorz.AVector;
import mikera.vectorz.Vectorz;
/**
* Abstract base class to represent sparse matrices with a single non-zero band
*
* Unlike ADiagonalMatrix, this matrix need not be square, and may have non-zero values on
* an arbitrary diagonal.
*
* @author Mike
*
*/
public abstract class ASingleBandMatrix extends ABandedMatrix {
private static final long serialVersionUID = -213068993524224396L;
/**
* Override to specify which band of the matrix is nonzero
* @return
*/
public abstract int nonZeroBand();
/**
* Gets the non-zero band from the matrix
* @return
*/
public abstract AVector getNonZeroBand();
@Override
public boolean isSymmetric() {
if (rowCount()!=columnCount()) return false;
if ((nonZeroBand()==0)||getNonZeroBand().isZero()) return true;
return false;
}
@Override
public boolean isIdentity() {
return isSquare()&&(nonZeroBand()==0)&&(getNonZeroBand().elementsEqual(1.0));
}
@Override
public boolean isZero() {
return getNonZeroBand().isZero();
}
@Override
public boolean isSparse() {
return true;
}
@Override
public long nonZeroCount() {
return getNonZeroBand().nonZeroCount();
}
@Override
public AVector getBand(int band) {
if (band==nonZeroBand()) {
return getNonZeroBand();
} else {
return Vectorz.createZeroVector(bandLength(band));
}
}
@Override
public boolean hasUncountable() {
return getNonZeroBand().hasUncountable();
}
@Override
public int rank() {
return (int)getNonZeroBand().nonZeroCount();
}
/**
* Returns the sum of all the elements raised to a specified power
* @return
*/
@Override
public double elementPowSum(double p) {
return getNonZeroBand().elementPowSum(p);
}
/**
* Returns the sum of the absolute values of all the elements raised to a specified power
* @return
*/
@Override
public double elementAbsPowSum(double p) {
return getNonZeroBand().elementAbsPowSum(p);
}
// TODO: inner product with single band matrix should be v.fast
}