package mikera.matrixx.impl; import java.util.Arrays; import mikera.matrixx.AMatrix; import mikera.vectorz.AVector; import mikera.vectorz.util.ErrorMessages; /** * Specialised class representing the broadcasting of a vector to a matrix shape * @author Mike * */ public final class BroadcastVectorMatrix extends ARectangularMatrix implements IFastRows { private static final long serialVersionUID = 8586152718389477791L; private final AVector vector; private BroadcastVectorMatrix(AVector v, int rows) { super(rows,v.length()); this.vector=v; } @Override public boolean isFullyMutable() { return false; } @Override public boolean isMutable() { return false; } public static BroadcastVectorMatrix wrap(AVector v, int rows) { return new BroadcastVectorMatrix(v,rows); } @Override public AVector getRowView(int row) { if (row<0 ||(row>=rows)) throw new IndexOutOfBoundsException("Row: "+row); return vector; } @Override public final void copyColumnTo(int col, double[] dest, int destOffset) { double v=vector.get(col); Arrays.fill(dest, destOffset, destOffset+rows, v); } @Override public final void copyRowTo(int row, double[] dest, int destOffset) { vector.getElements(dest,destOffset); } @Override public AMatrix subMatrix(int rowStart, int rows, int colStart, int cols) { return BroadcastVectorMatrix.wrap(vector.subVector(colStart, cols), rows); } @Override public AMatrix exactClone() { return BroadcastVectorMatrix.wrap(vector.exactClone(),rows); } @Override public double get(int row, int column) { if (row<0 ||(row>=rows)) throw new IndexOutOfBoundsException(ErrorMessages.invalidIndex(this, row,column)); return vector.get(column); } @Override public double unsafeGet(int row, int column) { return vector.unsafeGet(column); } @Override public void set(int row, int column, double value) { throw new UnsupportedOperationException(ErrorMessages.immutable(this)); } }