package mikera.matrixx.impl; import mikera.matrixx.AMatrix; import mikera.vectorz.AVector; import mikera.vectorz.impl.Vector0; /** * Abstract base class for a large matrix constructed out of regular subMatrix blocks * * @author Mike * */ public abstract class ABlockMatrix extends AMatrix { private static final long serialVersionUID = 5047577000801031158L; public abstract AMatrix getBlock(int rowBlock, int colBlock); public abstract int getBlockColumnCount(int colBlock); public abstract int getBlockRowCount(int rowBlock); public abstract int getBlockColumnStart(int colBlock); public abstract int getBlockRowStart(int rowBlock); public abstract int getColumnBlockIndex(int col); public abstract int getRowBlockIndex(int row); public abstract int columnBlockCount(); public abstract int rowBlockCount(); @Override public int componentCount() { return columnBlockCount()*rowBlockCount(); } @Override public void copyRowTo(int i, double[] dest, int destOffset) { getRow(i).copyTo(dest, destOffset); } @Override public void copyColumnTo(int j, double[] dest, int destOffset) { getColumn(j).copyTo(dest, destOffset); } @Override public AMatrix getComponent(int k) { int cbc=columnBlockCount(); long i=k / cbc; long j=k % cbc; return getBlock((int)i, (int)j); } @Override public AVector getRowView(int row) { int blockIndex=getRowBlockIndex(row); int blockPos=getBlockRowStart(blockIndex); int n=columnBlockCount(); AVector v=Vector0.INSTANCE; for (int i=0; i<n; i++) { v=v.join(getBlock(blockIndex,i).getRowView(row-blockPos)); } return v; } @Override public AVector getColumnView(int col) { int blockIndex=getColumnBlockIndex(col); int blockPos=getBlockColumnStart(blockIndex); int n=rowBlockCount(); AVector v=Vector0.INSTANCE; for (int i=0; i<n; i++) { v=v.join(getBlock(i,blockIndex).getColumnView(col-blockPos)); } return v; } }