package mikera.matrixx.impl; import mikera.matrixx.AMatrix; import mikera.matrixx.Matrix; import mikera.vectorz.AVector; /** * Class representing a transposed view of another matrix The transposed matrix * is a reference to the underlying matrix data * * @author Mike * */ public class TransposedMatrix extends ADelegatedMatrix { private static final long serialVersionUID = 4350297037540121584L; private TransposedMatrix(AMatrix source) { super(source.columnCount(),source.rowCount(),source); } public static AMatrix wrap(AMatrix m) { if (m instanceof TransposedMatrix) return ((TransposedMatrix) m).source; return new TransposedMatrix(m); } @Override public boolean isFullyMutable() { return source.isFullyMutable(); } @Override public boolean isMutable() { return source.isMutable(); } @Override public double get(int row, int column) { return source.get(column, row); } @Override public void set(int row, int column, double value) { source.set(column, row, value); } @Override public double unsafeGet(int row, int column) { return source.unsafeGet(column, row); } @Override public void unsafeSet(int row, int column, double value) { source.unsafeSet(column, row, value); } @Override public AVector getRow(int row) { return source.getColumn(row); } @Override public AVector getColumn(int column) { return source.getRow(column); } @Override public AVector getRowClone(int row) { return source.getColumnClone(row); } @Override public AVector getColumnClone(int column) { return source.getRowClone(column); } @Override public AVector getRowView(int row) { return source.getColumnView(row); } @Override public AVector getColumnView(int column) { return source.getRowView(column); } @Override public int sliceCount() { return source.columnCount(); } @Override public double trace() { return source.trace(); } @Override public double diagonalProduct() { return source.diagonalProduct(); } @Override public Matrix toMatrixTranspose() { return source.toMatrix(); } @Override public Matrix toMatrix() { return source.toMatrixTranspose(); } @Override public void copyRowTo(int row, double[] dest, int destOffset) { source.copyColumnTo(row, dest, destOffset); } @Override public void copyColumnTo(int col, double[] dest, int destOffset) { source.copyRowTo(col, dest, destOffset); } @Override public void getElements(double[] dest, int destOffset) { int rc=rowCount(); int cc=columnCount(); for (int i=0; i<rc; i++) { source.copyColumnTo(i, dest, destOffset+i*cc); } } @Override public double determinant() { return source.determinant(); } @Override public boolean isSymmetric() { return source.isSymmetric(); } @Override public boolean isSparse() { return source.isSparse(); } @Override public boolean isZero() { return source.isZero(); } @Override public boolean isUpperTriangular() { return source.isLowerTriangular(); } @Override public int lowerBandwidthLimit() { return source.upperBandwidthLimit(); } @Override public int lowerBandwidth() { return source.upperBandwidth(); } @Override public int upperBandwidthLimit() { return source.lowerBandwidthLimit(); } @Override public int upperBandwidth() { return source.lowerBandwidth(); } @Override public AVector getBand(int i) { return source.getBand(-i); } @Override public boolean isLowerTriangular() { return source.isUpperTriangular(); } @Override public AMatrix getTranspose() { // Transposing again just gets us back to the original source matrix return source; } @Override public AMatrix getTransposeView() { // Transposing again just gets us back to the original source matrix return source; } @Override public AMatrix getTransposeCopy() { return source.copy(); } @Override public AMatrix transposeInnerProduct(AMatrix s) { return source.innerProduct(s); } @Override public AMatrix transposeInnerProduct(Matrix s) { return source.innerProduct(s); } @Override public AMatrix innerProduct(AMatrix s) { return source.transposeInnerProduct(s); } @Override public AMatrix innerProduct(Matrix s) { return source.transposeInnerProduct(s); } @Override public AMatrix sparseClone() { if (source instanceof IFastColumns) { return SparseRowMatrix.create(source.getColumns()); } else if (source instanceof IFastRows) { return SparseColumnMatrix.create(source.getRows()); } return SparseRowMatrix.create(source.getColumns()); } @Override public TransposedMatrix exactClone() { return new TransposedMatrix(source.exactClone()); } @Override public boolean equals(AMatrix m) { return m.equalsTranspose(source); } }