package mikera.vectorz.util; import mikera.matrixx.AMatrix; import mikera.vectorz.AVector; import mikera.vectorz.Vectorz; /** * Utility class for efficiently building matrices by appending vector rows * * @author Mike */ public class MatrixBuilder extends AMatrix { private static final long serialVersionUID = -5875133722867126330L; private AVector[] data=new AVector[4]; int length=0; private void ensureSize(int newSize) { if (newSize>data.length) { AVector[] nd=new AVector[Math.min(newSize, data.length*2)]; System.arraycopy(data, 0, nd, 0, length); data=nd; } } public void append(Iterable<Object> d) { ensureSize(length+1); data[length++]=Vectorz.create(d); } public void append(AVector v) { ensureSize(length+1); data[length++]=Vectorz.create(v); } public void append(double[] ds) { ensureSize(length+1); data[length++]=Vectorz.create(ds); } public void appendRow(AVector row) { append(row); } @Override public void replaceRow(int i, AVector row) { if ((i<0)||(i>=length)) throw new IndexOutOfBoundsException(ErrorMessages.invalidSlice(this, i)); data[i]=row; } @Override public AVector getRowView(int row) { if ((row<0)||(row>=length)) throw new IndexOutOfBoundsException(ErrorMessages.invalidSlice(this, row)); return data[row]; } @Override public int rowCount() { return length; } @Override public int columnCount() { return data[0].length(); } @Override public AMatrix exactClone() { MatrixBuilder mb=new MatrixBuilder(); for (int i=0; i<length; i++) { mb.append(data[i].exactClone()); } return mb; } @Override public double get(int row, int column) { checkIndex(row,column); return data[row].get(column); } @Override public void set(int row, int column, double value) { checkIndex(row,column); data[row].set(column,value); } @Override public boolean isFullyMutable() { for (int i=0; i<rowCount(); i++) { if (!data[i].isFullyMutable()) return false; } return true; } }