You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by tn...@apache.org on 2015/02/16 23:39:39 UTC

[09/82] [partial] [math] Update for next development iteration: commons-math4

http://git-wip-us.apache.org/repos/asf/commons-math/blob/a7b4803f/src/main/java/org/apache/commons/math3/linear/AbstractFieldMatrix.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math3/linear/AbstractFieldMatrix.java b/src/main/java/org/apache/commons/math3/linear/AbstractFieldMatrix.java
deleted file mode 100644
index 686ffbb..0000000
--- a/src/main/java/org/apache/commons/math3/linear/AbstractFieldMatrix.java
+++ /dev/null
@@ -1,1156 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.math3.linear;
-
-import java.util.ArrayList;
-
-import org.apache.commons.math3.Field;
-import org.apache.commons.math3.FieldElement;
-import org.apache.commons.math3.exception.DimensionMismatchException;
-import org.apache.commons.math3.exception.NoDataException;
-import org.apache.commons.math3.exception.NotPositiveException;
-import org.apache.commons.math3.exception.NotStrictlyPositiveException;
-import org.apache.commons.math3.exception.NullArgumentException;
-import org.apache.commons.math3.exception.NumberIsTooSmallException;
-import org.apache.commons.math3.exception.OutOfRangeException;
-import org.apache.commons.math3.exception.util.LocalizedFormats;
-import org.apache.commons.math3.util.MathArrays;
-
-/**
- * Basic implementation of {@link FieldMatrix} methods regardless of the underlying storage.
- * <p>All the methods implemented here use {@link #getEntry(int, int)} to access
- * matrix elements. Derived class can provide faster implementations. </p>
- *
- * @param <T> Type of the field elements.
- *
- * @since 2.0
- */
-public abstract class AbstractFieldMatrix<T extends FieldElement<T>>
-    implements FieldMatrix<T> {
-    /** Field to which the elements belong. */
-    private final Field<T> field;
-
-    /**
-     * Constructor for use with Serializable
-     */
-    protected AbstractFieldMatrix() {
-        field = null;
-    }
-
-    /**
-     * Creates a matrix with no data
-     * @param field field to which the elements belong
-     */
-    protected AbstractFieldMatrix(final Field<T> field) {
-        this.field = field;
-    }
-
-    /**
-     * Create a new FieldMatrix<T> with the supplied row and column dimensions.
-     *
-     * @param field Field to which the elements belong.
-     * @param rowDimension Number of rows in the new matrix.
-     * @param columnDimension Number of columns in the new matrix.
-     * @throws NotStrictlyPositiveException if row or column dimension is not
-     * positive.
-     */
-    protected AbstractFieldMatrix(final Field<T> field,
-                                  final int rowDimension,
-                                  final int columnDimension)
-        throws NotStrictlyPositiveException {
-        if (rowDimension <= 0) {
-            throw new NotStrictlyPositiveException(LocalizedFormats.DIMENSION,
-                                                   rowDimension);
-        }
-        if (columnDimension <= 0) {
-            throw new NotStrictlyPositiveException(LocalizedFormats.DIMENSION,
-                                                   columnDimension);
-        }
-        this.field = field;
-    }
-
-    /**
-     * Get the elements type from an array.
-     *
-     * @param <T> Type of the field elements.
-     * @param d Data array.
-     * @return the field to which the array elements belong.
-     * @throws NullArgumentException if the array is {@code null}.
-     * @throws NoDataException if the array is empty.
-     */
-    protected static <T extends FieldElement<T>> Field<T> extractField(final T[][] d)
-        throws NoDataException, NullArgumentException {
-        if (d == null) {
-            throw new NullArgumentException();
-        }
-        if (d.length == 0) {
-            throw new NoDataException(LocalizedFormats.AT_LEAST_ONE_ROW);
-        }
-        if (d[0].length == 0) {
-            throw new NoDataException(LocalizedFormats.AT_LEAST_ONE_COLUMN);
-        }
-        return d[0][0].getField();
-    }
-
-    /**
-     * Get the elements type from an array.
-     *
-     * @param <T> Type of the field elements.
-     * @param d Data array.
-     * @return the field to which the array elements belong.
-     * @throws NoDataException if array is empty.
-     */
-    protected static <T extends FieldElement<T>> Field<T> extractField(final T[] d)
-        throws NoDataException {
-        if (d.length == 0) {
-            throw new NoDataException(LocalizedFormats.AT_LEAST_ONE_ROW);
-        }
-        return d[0].getField();
-    }
-
-    /** Build an array of elements.
-     * <p>
-     * Complete arrays are filled with field.getZero()
-     * </p>
-     * @param <T> Type of the field elements
-     * @param field field to which array elements belong
-     * @param rows number of rows
-     * @param columns number of columns (may be negative to build partial
-     * arrays in the same way <code>new Field[rows][]</code> works)
-     * @return a new array
-     * @deprecated as of 3.2, replaced by {@link MathArrays#buildArray(Field, int, int)}
-     */
-    @Deprecated
-    protected static <T extends FieldElement<T>> T[][] buildArray(final Field<T> field,
-                                                                  final int rows,
-                                                                  final int columns) {
-        return MathArrays.buildArray(field, rows, columns);
-    }
-
-    /** Build an array of elements.
-     * <p>
-     * Arrays are filled with field.getZero()
-     * </p>
-     * @param <T> the type of the field elements
-     * @param field field to which array elements belong
-     * @param length of the array
-     * @return a new array
-     * @deprecated as of 3.2, replaced by {@link MathArrays#buildArray(Field, int)}
-     */
-    @Deprecated
-    protected static <T extends FieldElement<T>> T[] buildArray(final Field<T> field,
-                                                                final int length) {
-        return MathArrays.buildArray(field, length);
-    }
-
-    /** {@inheritDoc} */
-    public Field<T> getField() {
-        return field;
-    }
-
-    /** {@inheritDoc} */
-    public abstract FieldMatrix<T> createMatrix(final int rowDimension,
-                                                final int columnDimension)
-        throws NotStrictlyPositiveException;
-
-    /** {@inheritDoc} */
-    public abstract FieldMatrix<T> copy();
-
-    /** {@inheritDoc} */
-    public FieldMatrix<T> add(FieldMatrix<T> m)
-        throws MatrixDimensionMismatchException {
-        // safety check
-        checkAdditionCompatible(m);
-
-        final int rowCount    = getRowDimension();
-        final int columnCount = getColumnDimension();
-        final FieldMatrix<T> out = createMatrix(rowCount, columnCount);
-        for (int row = 0; row < rowCount; ++row) {
-            for (int col = 0; col < columnCount; ++col) {
-                out.setEntry(row, col, getEntry(row, col).add(m.getEntry(row, col)));
-            }
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public FieldMatrix<T> subtract(final FieldMatrix<T> m)
-        throws MatrixDimensionMismatchException {
-        // safety check
-        checkSubtractionCompatible(m);
-
-        final int rowCount    = getRowDimension();
-        final int columnCount = getColumnDimension();
-        final FieldMatrix<T> out = createMatrix(rowCount, columnCount);
-        for (int row = 0; row < rowCount; ++row) {
-            for (int col = 0; col < columnCount; ++col) {
-                out.setEntry(row, col, getEntry(row, col).subtract(m.getEntry(row, col)));
-            }
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public FieldMatrix<T> scalarAdd(final T d) {
-
-        final int rowCount    = getRowDimension();
-        final int columnCount = getColumnDimension();
-        final FieldMatrix<T> out = createMatrix(rowCount, columnCount);
-        for (int row = 0; row < rowCount; ++row) {
-            for (int col = 0; col < columnCount; ++col) {
-                out.setEntry(row, col, getEntry(row, col).add(d));
-            }
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public FieldMatrix<T> scalarMultiply(final T d) {
-        final int rowCount    = getRowDimension();
-        final int columnCount = getColumnDimension();
-        final FieldMatrix<T> out = createMatrix(rowCount, columnCount);
-        for (int row = 0; row < rowCount; ++row) {
-            for (int col = 0; col < columnCount; ++col) {
-                out.setEntry(row, col, getEntry(row, col).multiply(d));
-            }
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public FieldMatrix<T> multiply(final FieldMatrix<T> m)
-        throws DimensionMismatchException {
-        // safety check
-        checkMultiplicationCompatible(m);
-
-        final int nRows = getRowDimension();
-        final int nCols = m.getColumnDimension();
-        final int nSum  = getColumnDimension();
-        final FieldMatrix<T> out = createMatrix(nRows, nCols);
-        for (int row = 0; row < nRows; ++row) {
-            for (int col = 0; col < nCols; ++col) {
-                T sum = field.getZero();
-                for (int i = 0; i < nSum; ++i) {
-                    sum = sum.add(getEntry(row, i).multiply(m.getEntry(i, col)));
-                }
-                out.setEntry(row, col, sum);
-            }
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public FieldMatrix<T> preMultiply(final FieldMatrix<T> m)
-        throws DimensionMismatchException {
-        return m.multiply(this);
-    }
-
-    /** {@inheritDoc} */
-    public FieldMatrix<T> power(final int p) throws NonSquareMatrixException,
-    NotPositiveException {
-        if (p < 0) {
-            throw new NotPositiveException(p);
-        }
-
-        if (!isSquare()) {
-            throw new NonSquareMatrixException(getRowDimension(), getColumnDimension());
-        }
-
-        if (p == 0) {
-            return MatrixUtils.createFieldIdentityMatrix(this.getField(), this.getRowDimension());
-        }
-
-        if (p == 1) {
-            return this.copy();
-        }
-
-        final int power = p - 1;
-
-        /*
-         * Only log_2(p) operations is used by doing as follows:
-         * 5^214 = 5^128 * 5^64 * 5^16 * 5^4 * 5^2
-         *
-         * In general, the same approach is used for A^p.
-         */
-
-        final char[] binaryRepresentation = Integer.toBinaryString(power)
-                .toCharArray();
-        final ArrayList<Integer> nonZeroPositions = new ArrayList<Integer>();
-
-        for (int i = 0; i < binaryRepresentation.length; ++i) {
-            if (binaryRepresentation[i] == '1') {
-                final int pos = binaryRepresentation.length - i - 1;
-                nonZeroPositions.add(pos);
-            }
-        }
-
-        ArrayList<FieldMatrix<T>> results = new ArrayList<FieldMatrix<T>>(
-                binaryRepresentation.length);
-
-        results.add(0, this.copy());
-
-        for (int i = 1; i < binaryRepresentation.length; ++i) {
-            final FieldMatrix<T> s = results.get(i - 1);
-            final FieldMatrix<T> r = s.multiply(s);
-            results.add(i, r);
-        }
-
-        FieldMatrix<T> result = this.copy();
-
-        for (Integer i : nonZeroPositions) {
-            result = result.multiply(results.get(i));
-        }
-
-        return result;
-    }
-
-    /** {@inheritDoc} */
-    public T[][] getData() {
-        final T[][] data = MathArrays.buildArray(field, getRowDimension(), getColumnDimension());
-
-        for (int i = 0; i < data.length; ++i) {
-            final T[] dataI = data[i];
-            for (int j = 0; j < dataI.length; ++j) {
-                dataI[j] = getEntry(i, j);
-            }
-        }
-
-        return data;
-    }
-
-    /** {@inheritDoc} */
-    public FieldMatrix<T> getSubMatrix(final int startRow, final int endRow,
-                                       final int startColumn, final int endColumn)
-        throws NumberIsTooSmallException, OutOfRangeException {
-        checkSubMatrixIndex(startRow, endRow, startColumn, endColumn);
-
-        final FieldMatrix<T> subMatrix =
-            createMatrix(endRow - startRow + 1, endColumn - startColumn + 1);
-        for (int i = startRow; i <= endRow; ++i) {
-            for (int j = startColumn; j <= endColumn; ++j) {
-                subMatrix.setEntry(i - startRow, j - startColumn, getEntry(i, j));
-            }
-        }
-
-        return subMatrix;
-
-    }
-
-    /** {@inheritDoc} */
-    public FieldMatrix<T> getSubMatrix(final int[] selectedRows,
-                                       final int[] selectedColumns)
-    throws NoDataException, NullArgumentException, OutOfRangeException {
-
-        // safety checks
-        checkSubMatrixIndex(selectedRows, selectedColumns);
-
-        // copy entries
-        final FieldMatrix<T> subMatrix =
-            createMatrix(selectedRows.length, selectedColumns.length);
-        subMatrix.walkInOptimizedOrder(new DefaultFieldMatrixChangingVisitor<T>(field.getZero()) {
-
-            /** {@inheritDoc} */
-            @Override
-            public T visit(final int row, final int column, final T value) {
-                return getEntry(selectedRows[row], selectedColumns[column]);
-            }
-
-        });
-
-        return subMatrix;
-
-    }
-
-    /** {@inheritDoc} */
-    public void copySubMatrix(final int startRow, final int endRow,
-                              final int startColumn, final int endColumn,
-                              final T[][] destination)
-    throws MatrixDimensionMismatchException, NumberIsTooSmallException,
-    OutOfRangeException{
-        // safety checks
-        checkSubMatrixIndex(startRow, endRow, startColumn, endColumn);
-        final int rowsCount    = endRow + 1 - startRow;
-        final int columnsCount = endColumn + 1 - startColumn;
-        if ((destination.length < rowsCount) || (destination[0].length < columnsCount)) {
-            throw new MatrixDimensionMismatchException(destination.length,
-                                                       destination[0].length,
-                                                       rowsCount,
-                                                       columnsCount);
-        }
-
-        // copy entries
-        walkInOptimizedOrder(new DefaultFieldMatrixPreservingVisitor<T>(field.getZero()) {
-
-            /** Initial row index. */
-            private int startRow;
-
-            /** Initial column index. */
-            private int startColumn;
-
-            /** {@inheritDoc} */
-            @Override
-            public void start(final int rows, final int columns,
-                              final int startRow, final int endRow,
-                              final int startColumn, final int endColumn) {
-                this.startRow    = startRow;
-                this.startColumn = startColumn;
-            }
-
-            /** {@inheritDoc} */
-            @Override
-            public void visit(final int row, final int column, final T value) {
-                destination[row - startRow][column - startColumn] = value;
-            }
-
-        }, startRow, endRow, startColumn, endColumn);
-
-    }
-
-    /** {@inheritDoc} */
-    public void copySubMatrix(int[] selectedRows, int[] selectedColumns, T[][] destination)
-        throws MatrixDimensionMismatchException, NoDataException,
-        NullArgumentException, OutOfRangeException {
-        // safety checks
-        checkSubMatrixIndex(selectedRows, selectedColumns);
-        if ((destination.length < selectedRows.length) ||
-            (destination[0].length < selectedColumns.length)) {
-            throw new MatrixDimensionMismatchException(destination.length,
-                                                       destination[0].length,
-                                                       selectedRows.length,
-                                                       selectedColumns.length);
-        }
-
-        // copy entries
-        for (int i = 0; i < selectedRows.length; i++) {
-            final T[] destinationI = destination[i];
-            for (int j = 0; j < selectedColumns.length; j++) {
-                destinationI[j] = getEntry(selectedRows[i], selectedColumns[j]);
-            }
-        }
-
-    }
-
-    /** {@inheritDoc} */
-    public void setSubMatrix(final T[][] subMatrix, final int row,
-                             final int column)
-        throws DimensionMismatchException, OutOfRangeException,
-        NoDataException, NullArgumentException {
-        if (subMatrix == null) {
-            throw new NullArgumentException();
-        }
-        final int nRows = subMatrix.length;
-        if (nRows == 0) {
-            throw new NoDataException(LocalizedFormats.AT_LEAST_ONE_ROW);
-        }
-
-        final int nCols = subMatrix[0].length;
-        if (nCols == 0) {
-            throw new NoDataException(LocalizedFormats.AT_LEAST_ONE_COLUMN);
-        }
-
-        for (int r = 1; r < nRows; ++r) {
-            if (subMatrix[r].length != nCols) {
-                throw new DimensionMismatchException(nCols, subMatrix[r].length);
-            }
-        }
-
-        checkRowIndex(row);
-        checkColumnIndex(column);
-        checkRowIndex(nRows + row - 1);
-        checkColumnIndex(nCols + column - 1);
-
-        for (int i = 0; i < nRows; ++i) {
-            for (int j = 0; j < nCols; ++j) {
-                setEntry(row + i, column + j, subMatrix[i][j]);
-            }
-        }
-    }
-
-    /** {@inheritDoc} */
-    public FieldMatrix<T> getRowMatrix(final int row) throws OutOfRangeException {
-        checkRowIndex(row);
-        final int nCols = getColumnDimension();
-        final FieldMatrix<T> out = createMatrix(1, nCols);
-        for (int i = 0; i < nCols; ++i) {
-            out.setEntry(0, i, getEntry(row, i));
-        }
-
-        return out;
-
-    }
-
-    /** {@inheritDoc} */
-    public void setRowMatrix(final int row, final FieldMatrix<T> matrix)
-        throws OutOfRangeException, MatrixDimensionMismatchException {
-        checkRowIndex(row);
-        final int nCols = getColumnDimension();
-        if ((matrix.getRowDimension() != 1) ||
-            (matrix.getColumnDimension() != nCols)) {
-            throw new MatrixDimensionMismatchException(matrix.getRowDimension(),
-                                                       matrix.getColumnDimension(),
-                                                       1, nCols);
-        }
-        for (int i = 0; i < nCols; ++i) {
-            setEntry(row, i, matrix.getEntry(0, i));
-        }
-
-    }
-
-    /** {@inheritDoc} */
-    public FieldMatrix<T> getColumnMatrix(final int column)
-    throws OutOfRangeException {
-
-        checkColumnIndex(column);
-        final int nRows = getRowDimension();
-        final FieldMatrix<T> out = createMatrix(nRows, 1);
-        for (int i = 0; i < nRows; ++i) {
-            out.setEntry(i, 0, getEntry(i, column));
-        }
-
-        return out;
-
-    }
-
-    /** {@inheritDoc} */
-    public void setColumnMatrix(final int column, final FieldMatrix<T> matrix)
-        throws OutOfRangeException, MatrixDimensionMismatchException {
-        checkColumnIndex(column);
-        final int nRows = getRowDimension();
-        if ((matrix.getRowDimension() != nRows) ||
-            (matrix.getColumnDimension() != 1)) {
-            throw new MatrixDimensionMismatchException(matrix.getRowDimension(),
-                                                       matrix.getColumnDimension(),
-                                                       nRows, 1);
-        }
-        for (int i = 0; i < nRows; ++i) {
-            setEntry(i, column, matrix.getEntry(i, 0));
-        }
-
-    }
-
-    /** {@inheritDoc} */
-    public FieldVector<T> getRowVector(final int row)
-        throws OutOfRangeException {
-        return new ArrayFieldVector<T>(field, getRow(row), false);
-    }
-
-    /** {@inheritDoc} */
-    public void setRowVector(final int row, final FieldVector<T> vector)
-        throws OutOfRangeException, MatrixDimensionMismatchException {
-        checkRowIndex(row);
-        final int nCols = getColumnDimension();
-        if (vector.getDimension() != nCols) {
-            throw new MatrixDimensionMismatchException(1, vector.getDimension(),
-                                                       1, nCols);
-        }
-        for (int i = 0; i < nCols; ++i) {
-            setEntry(row, i, vector.getEntry(i));
-        }
-
-    }
-
-    /** {@inheritDoc} */
-    public FieldVector<T> getColumnVector(final int column)
-        throws OutOfRangeException {
-        return new ArrayFieldVector<T>(field, getColumn(column), false);
-    }
-
-    /** {@inheritDoc} */
-    public void setColumnVector(final int column, final FieldVector<T> vector)
-        throws OutOfRangeException, MatrixDimensionMismatchException {
-
-        checkColumnIndex(column);
-        final int nRows = getRowDimension();
-        if (vector.getDimension() != nRows) {
-            throw new MatrixDimensionMismatchException(vector.getDimension(), 1,
-                                                       nRows, 1);
-        }
-        for (int i = 0; i < nRows; ++i) {
-            setEntry(i, column, vector.getEntry(i));
-        }
-
-    }
-
-    /** {@inheritDoc} */
-    public T[] getRow(final int row) throws OutOfRangeException {
-        checkRowIndex(row);
-        final int nCols = getColumnDimension();
-        final T[] out = MathArrays.buildArray(field, nCols);
-        for (int i = 0; i < nCols; ++i) {
-            out[i] = getEntry(row, i);
-        }
-
-        return out;
-
-    }
-
-    /** {@inheritDoc} */
-    public void setRow(final int row, final T[] array)
-        throws OutOfRangeException, MatrixDimensionMismatchException {
-        checkRowIndex(row);
-        final int nCols = getColumnDimension();
-        if (array.length != nCols) {
-            throw new MatrixDimensionMismatchException(1, array.length, 1, nCols);
-        }
-        for (int i = 0; i < nCols; ++i) {
-            setEntry(row, i, array[i]);
-        }
-
-    }
-
-    /** {@inheritDoc} */
-    public T[] getColumn(final int column) throws OutOfRangeException {
-        checkColumnIndex(column);
-        final int nRows = getRowDimension();
-        final T[] out = MathArrays.buildArray(field, nRows);
-        for (int i = 0; i < nRows; ++i) {
-            out[i] = getEntry(i, column);
-        }
-
-        return out;
-
-    }
-
-    /** {@inheritDoc} */
-    public void setColumn(final int column, final T[] array)
-        throws OutOfRangeException, MatrixDimensionMismatchException {
-        checkColumnIndex(column);
-        final int nRows = getRowDimension();
-        if (array.length != nRows) {
-            throw new MatrixDimensionMismatchException(array.length, 1, nRows, 1);
-        }
-        for (int i = 0; i < nRows; ++i) {
-            setEntry(i, column, array[i]);
-        }
-    }
-
-    /** {@inheritDoc} */
-    public abstract T getEntry(int row, int column) throws OutOfRangeException;
-
-    /** {@inheritDoc} */
-    public abstract void setEntry(int row, int column, T value) throws OutOfRangeException;
-
-    /** {@inheritDoc} */
-    public abstract void addToEntry(int row, int column, T increment) throws OutOfRangeException;
-
-    /** {@inheritDoc} */
-    public abstract void multiplyEntry(int row, int column, T factor) throws OutOfRangeException;
-
-    /** {@inheritDoc} */
-    public FieldMatrix<T> transpose() {
-        final int nRows = getRowDimension();
-        final int nCols = getColumnDimension();
-        final FieldMatrix<T> out = createMatrix(nCols, nRows);
-        walkInOptimizedOrder(new DefaultFieldMatrixPreservingVisitor<T>(field.getZero()) {
-            /** {@inheritDoc} */
-            @Override
-            public void visit(final int row, final int column, final T value) {
-                out.setEntry(column, row, value);
-            }
-        });
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public boolean isSquare() {
-        return getColumnDimension() == getRowDimension();
-    }
-
-    /** {@inheritDoc} */
-    public abstract int getRowDimension();
-
-    /** {@inheritDoc} */
-    public abstract int getColumnDimension();
-
-    /** {@inheritDoc} */
-    public T getTrace() throws NonSquareMatrixException {
-        final int nRows = getRowDimension();
-        final int nCols = getColumnDimension();
-        if (nRows != nCols) {
-            throw new NonSquareMatrixException(nRows, nCols);
-       }
-        T trace = field.getZero();
-        for (int i = 0; i < nRows; ++i) {
-            trace = trace.add(getEntry(i, i));
-        }
-        return trace;
-    }
-
-    /** {@inheritDoc} */
-    public T[] operate(final T[] v) throws DimensionMismatchException {
-
-        final int nRows = getRowDimension();
-        final int nCols = getColumnDimension();
-        if (v.length != nCols) {
-            throw new DimensionMismatchException(v.length, nCols);
-        }
-
-        final T[] out = MathArrays.buildArray(field, nRows);
-        for (int row = 0; row < nRows; ++row) {
-            T sum = field.getZero();
-            for (int i = 0; i < nCols; ++i) {
-                sum = sum.add(getEntry(row, i).multiply(v[i]));
-            }
-            out[row] = sum;
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public FieldVector<T> operate(final FieldVector<T> v)
-        throws DimensionMismatchException {
-        try {
-            return new ArrayFieldVector<T>(field, operate(((ArrayFieldVector<T>) v).getDataRef()), false);
-        } catch (ClassCastException cce) {
-            final int nRows = getRowDimension();
-            final int nCols = getColumnDimension();
-            if (v.getDimension() != nCols) {
-                throw new DimensionMismatchException(v.getDimension(), nCols);
-            }
-
-            final T[] out = MathArrays.buildArray(field, nRows);
-            for (int row = 0; row < nRows; ++row) {
-                T sum = field.getZero();
-                for (int i = 0; i < nCols; ++i) {
-                    sum = sum.add(getEntry(row, i).multiply(v.getEntry(i)));
-                }
-                out[row] = sum;
-            }
-
-            return new ArrayFieldVector<T>(field, out, false);
-        }
-    }
-
-    /** {@inheritDoc} */
-    public T[] preMultiply(final T[] v) throws DimensionMismatchException {
-
-        final int nRows = getRowDimension();
-        final int nCols = getColumnDimension();
-        if (v.length != nRows) {
-            throw new DimensionMismatchException(v.length, nRows);
-        }
-
-        final T[] out = MathArrays.buildArray(field, nCols);
-        for (int col = 0; col < nCols; ++col) {
-            T sum = field.getZero();
-            for (int i = 0; i < nRows; ++i) {
-                sum = sum.add(getEntry(i, col).multiply(v[i]));
-            }
-            out[col] = sum;
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public FieldVector<T> preMultiply(final FieldVector<T> v)
-        throws DimensionMismatchException {
-        try {
-            return new ArrayFieldVector<T>(field, preMultiply(((ArrayFieldVector<T>) v).getDataRef()), false);
-        } catch (ClassCastException cce) {
-            final int nRows = getRowDimension();
-            final int nCols = getColumnDimension();
-            if (v.getDimension() != nRows) {
-                throw new DimensionMismatchException(v.getDimension(), nRows);
-            }
-
-            final T[] out = MathArrays.buildArray(field, nCols);
-            for (int col = 0; col < nCols; ++col) {
-                T sum = field.getZero();
-                for (int i = 0; i < nRows; ++i) {
-                    sum = sum.add(getEntry(i, col).multiply(v.getEntry(i)));
-                }
-                out[col] = sum;
-            }
-
-            return new ArrayFieldVector<T>(field, out, false);
-        }
-    }
-
-    /** {@inheritDoc} */
-    public T walkInRowOrder(final FieldMatrixChangingVisitor<T> visitor) {
-        final int rows    = getRowDimension();
-        final int columns = getColumnDimension();
-        visitor.start(rows, columns, 0, rows - 1, 0, columns - 1);
-        for (int row = 0; row < rows; ++row) {
-            for (int column = 0; column < columns; ++column) {
-                final T oldValue = getEntry(row, column);
-                final T newValue = visitor.visit(row, column, oldValue);
-                setEntry(row, column, newValue);
-            }
-        }
-        return visitor.end();
-    }
-
-    /** {@inheritDoc} */
-    public T walkInRowOrder(final FieldMatrixPreservingVisitor<T> visitor) {
-        final int rows    = getRowDimension();
-        final int columns = getColumnDimension();
-        visitor.start(rows, columns, 0, rows - 1, 0, columns - 1);
-        for (int row = 0; row < rows; ++row) {
-            for (int column = 0; column < columns; ++column) {
-                visitor.visit(row, column, getEntry(row, column));
-            }
-        }
-        return visitor.end();
-    }
-
-    /** {@inheritDoc} */
-    public T walkInRowOrder(final FieldMatrixChangingVisitor<T> visitor,
-                            final int startRow, final int endRow,
-                            final int startColumn, final int endColumn)
-        throws NumberIsTooSmallException, OutOfRangeException {
-        checkSubMatrixIndex(startRow, endRow, startColumn, endColumn);
-        visitor.start(getRowDimension(), getColumnDimension(),
-                      startRow, endRow, startColumn, endColumn);
-        for (int row = startRow; row <= endRow; ++row) {
-            for (int column = startColumn; column <= endColumn; ++column) {
-                final T oldValue = getEntry(row, column);
-                final T newValue = visitor.visit(row, column, oldValue);
-                setEntry(row, column, newValue);
-            }
-        }
-        return visitor.end();
-    }
-
-    /** {@inheritDoc} */
-    public T walkInRowOrder(final FieldMatrixPreservingVisitor<T> visitor,
-                            final int startRow, final int endRow,
-                            final int startColumn, final int endColumn)
-        throws NumberIsTooSmallException, OutOfRangeException {
-        checkSubMatrixIndex(startRow, endRow, startColumn, endColumn);
-        visitor.start(getRowDimension(), getColumnDimension(),
-                      startRow, endRow, startColumn, endColumn);
-        for (int row = startRow; row <= endRow; ++row) {
-            for (int column = startColumn; column <= endColumn; ++column) {
-                visitor.visit(row, column, getEntry(row, column));
-            }
-        }
-        return visitor.end();
-    }
-
-    /** {@inheritDoc} */
-    public T walkInColumnOrder(final FieldMatrixChangingVisitor<T> visitor) {
-        final int rows    = getRowDimension();
-        final int columns = getColumnDimension();
-        visitor.start(rows, columns, 0, rows - 1, 0, columns - 1);
-        for (int column = 0; column < columns; ++column) {
-            for (int row = 0; row < rows; ++row) {
-                final T oldValue = getEntry(row, column);
-                final T newValue = visitor.visit(row, column, oldValue);
-                setEntry(row, column, newValue);
-            }
-        }
-        return visitor.end();
-    }
-
-    /** {@inheritDoc} */
-    public T walkInColumnOrder(final FieldMatrixPreservingVisitor<T> visitor) {
-        final int rows    = getRowDimension();
-        final int columns = getColumnDimension();
-        visitor.start(rows, columns, 0, rows - 1, 0, columns - 1);
-        for (int column = 0; column < columns; ++column) {
-            for (int row = 0; row < rows; ++row) {
-                visitor.visit(row, column, getEntry(row, column));
-            }
-        }
-        return visitor.end();
-    }
-
-    /** {@inheritDoc} */
-    public T walkInColumnOrder(final FieldMatrixChangingVisitor<T> visitor,
-                               final int startRow, final int endRow,
-                               final int startColumn, final int endColumn)
-    throws NumberIsTooSmallException, OutOfRangeException {
-        checkSubMatrixIndex(startRow, endRow, startColumn, endColumn);
-        visitor.start(getRowDimension(), getColumnDimension(),
-                      startRow, endRow, startColumn, endColumn);
-        for (int column = startColumn; column <= endColumn; ++column) {
-            for (int row = startRow; row <= endRow; ++row) {
-                final T oldValue = getEntry(row, column);
-                final T newValue = visitor.visit(row, column, oldValue);
-                setEntry(row, column, newValue);
-            }
-        }
-        return visitor.end();
-    }
-
-    /** {@inheritDoc} */
-    public T walkInColumnOrder(final FieldMatrixPreservingVisitor<T> visitor,
-                               final int startRow, final int endRow,
-                               final int startColumn, final int endColumn)
-    throws NumberIsTooSmallException, OutOfRangeException{
-        checkSubMatrixIndex(startRow, endRow, startColumn, endColumn);
-        visitor.start(getRowDimension(), getColumnDimension(),
-                      startRow, endRow, startColumn, endColumn);
-        for (int column = startColumn; column <= endColumn; ++column) {
-            for (int row = startRow; row <= endRow; ++row) {
-                visitor.visit(row, column, getEntry(row, column));
-            }
-        }
-        return visitor.end();
-    }
-
-    /** {@inheritDoc} */
-    public T walkInOptimizedOrder(final FieldMatrixChangingVisitor<T> visitor) {
-        return walkInRowOrder(visitor);
-    }
-
-    /** {@inheritDoc} */
-    public T walkInOptimizedOrder(final FieldMatrixPreservingVisitor<T> visitor) {
-        return walkInRowOrder(visitor);
-    }
-
-    /** {@inheritDoc} */
-    public T walkInOptimizedOrder(final FieldMatrixChangingVisitor<T> visitor,
-                                  final int startRow, final int endRow,
-                                  final int startColumn, final int endColumn)
-        throws NumberIsTooSmallException, OutOfRangeException {
-        return walkInRowOrder(visitor, startRow, endRow, startColumn, endColumn);
-    }
-
-    /** {@inheritDoc} */
-    public T walkInOptimizedOrder(final FieldMatrixPreservingVisitor<T> visitor,
-                                  final int startRow, final int endRow,
-                                  final int startColumn, final int endColumn)
-        throws NumberIsTooSmallException, OutOfRangeException {
-        return walkInRowOrder(visitor, startRow, endRow, startColumn, endColumn);
-    }
-
-    /**
-     * Get a string representation for this matrix.
-     * @return a string representation for this matrix
-     */
-    @Override
-    public String toString() {
-        final int nRows = getRowDimension();
-        final int nCols = getColumnDimension();
-        final StringBuffer res = new StringBuffer();
-        String fullClassName = getClass().getName();
-        String shortClassName = fullClassName.substring(fullClassName.lastIndexOf('.') + 1);
-        res.append(shortClassName).append("{");
-
-        for (int i = 0; i < nRows; ++i) {
-            if (i > 0) {
-                res.append(",");
-            }
-            res.append("{");
-            for (int j = 0; j < nCols; ++j) {
-                if (j > 0) {
-                    res.append(",");
-                }
-                res.append(getEntry(i, j));
-            }
-            res.append("}");
-        }
-
-        res.append("}");
-        return res.toString();
-    }
-
-    /**
-     * Returns true iff <code>object</code> is a
-     * <code>FieldMatrix</code> instance with the same dimensions as this
-     * and all corresponding matrix entries are equal.
-     *
-     * @param object the object to test equality against.
-     * @return true if object equals this
-     */
-    @Override
-    public boolean equals(final Object object) {
-        if (object == this ) {
-            return true;
-        }
-        if (object instanceof FieldMatrix<?> == false) {
-            return false;
-        }
-        FieldMatrix<?> m = (FieldMatrix<?>) object;
-        final int nRows = getRowDimension();
-        final int nCols = getColumnDimension();
-        if (m.getColumnDimension() != nCols || m.getRowDimension() != nRows) {
-            return false;
-        }
-        for (int row = 0; row < nRows; ++row) {
-            for (int col = 0; col < nCols; ++col) {
-                if (!getEntry(row, col).equals(m.getEntry(row, col))) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Computes a hashcode for the matrix.
-     *
-     * @return hashcode for matrix
-     */
-    @Override
-    public int hashCode() {
-        int ret = 322562;
-        final int nRows = getRowDimension();
-        final int nCols = getColumnDimension();
-        ret = ret * 31 + nRows;
-        ret = ret * 31 + nCols;
-        for (int row = 0; row < nRows; ++row) {
-            for (int col = 0; col < nCols; ++col) {
-               ret = ret * 31 + (11 * (row+1) + 17 * (col+1)) * getEntry(row, col).hashCode();
-           }
-        }
-        return ret;
-    }
-
-    /**
-     * Check if a row index is valid.
-     *
-     * @param row Row index to check.
-     * @throws OutOfRangeException if {@code index} is not valid.
-     */
-    protected void checkRowIndex(final int row) throws OutOfRangeException {
-        if (row < 0 || row >= getRowDimension()) {
-            throw new OutOfRangeException(LocalizedFormats.ROW_INDEX,
-                                          row, 0, getRowDimension() - 1);
-        }
-    }
-
-    /**
-     * Check if a column index is valid.
-     *
-     * @param column Column index to check.
-     * @throws OutOfRangeException if {@code index} is not valid.
-     */
-    protected void checkColumnIndex(final int column)
-        throws OutOfRangeException {
-        if (column < 0 || column >= getColumnDimension()) {
-            throw new OutOfRangeException(LocalizedFormats.COLUMN_INDEX,
-                                          column, 0, getColumnDimension() - 1);
-        }
-    }
-
-    /**
-     * Check if submatrix ranges indices are valid.
-     * Rows and columns are indicated counting from 0 to n-1.
-     *
-     * @param startRow Initial row index.
-     * @param endRow Final row index.
-     * @param startColumn Initial column index.
-     * @param endColumn Final column index.
-     * @throws OutOfRangeException if the indices are not valid.
-     * @throws NumberIsTooSmallException if {@code endRow < startRow} or
-     * {@code endColumn < startColumn}.
-     */
-    protected void checkSubMatrixIndex(final int startRow, final int endRow,
-                                       final int startColumn, final int endColumn)
-        throws NumberIsTooSmallException, OutOfRangeException {
-        checkRowIndex(startRow);
-        checkRowIndex(endRow);
-        if (endRow < startRow) {
-            throw new NumberIsTooSmallException(LocalizedFormats.INITIAL_ROW_AFTER_FINAL_ROW,
-                                                endRow, startRow, true);
-        }
-
-        checkColumnIndex(startColumn);
-        checkColumnIndex(endColumn);
-        if (endColumn < startColumn) {
-            throw new NumberIsTooSmallException(LocalizedFormats.INITIAL_COLUMN_AFTER_FINAL_COLUMN,
-                                                endColumn, startColumn, true);
-        }
-    }
-
-    /**
-     * Check if submatrix ranges indices are valid.
-     * Rows and columns are indicated counting from 0 to n-1.
-     *
-     * @param selectedRows Array of row indices.
-     * @param selectedColumns Array of column indices.
-     * @throws NullArgumentException if the arrays are {@code null}.
-     * @throws NoDataException if the arrays have zero length.
-     * @throws OutOfRangeException if row or column selections are not valid.
-     */
-    protected void checkSubMatrixIndex(final int[] selectedRows, final int[] selectedColumns)
-        throws NoDataException, NullArgumentException, OutOfRangeException {
-        if (selectedRows == null ||
-            selectedColumns == null) {
-            throw new NullArgumentException();
-        }
-        if (selectedRows.length == 0 ||
-            selectedColumns.length == 0) {
-            throw new NoDataException();
-        }
-
-        for (final int row : selectedRows) {
-            checkRowIndex(row);
-        }
-        for (final int column : selectedColumns) {
-            checkColumnIndex(column);
-        }
-    }
-
-    /**
-     * Check if a matrix is addition compatible with the instance.
-     *
-     * @param m Matrix to check.
-     * @throws MatrixDimensionMismatchException if the matrix is not
-     * addition-compatible with instance.
-     */
-    protected void checkAdditionCompatible(final FieldMatrix<T> m)
-        throws MatrixDimensionMismatchException {
-        if ((getRowDimension() != m.getRowDimension()) ||
-            (getColumnDimension() != m.getColumnDimension())) {
-            throw new MatrixDimensionMismatchException(m.getRowDimension(), m.getColumnDimension(),
-                                                       getRowDimension(), getColumnDimension());
-        }
-    }
-
-    /**
-     * Check if a matrix is subtraction compatible with the instance.
-     *
-     * @param m Matrix to check.
-     * @throws MatrixDimensionMismatchException if the matrix is not
-     * subtraction-compatible with instance.
-     */
-    protected void checkSubtractionCompatible(final FieldMatrix<T> m)
-        throws MatrixDimensionMismatchException {
-        if ((getRowDimension() != m.getRowDimension()) ||
-            (getColumnDimension() != m.getColumnDimension())) {
-            throw new MatrixDimensionMismatchException(m.getRowDimension(), m.getColumnDimension(),
-                                                       getRowDimension(), getColumnDimension());
-        }
-    }
-
-    /**
-     * Check if a matrix is multiplication compatible with the instance.
-     *
-     * @param m Matrix to check.
-     * @throws DimensionMismatchException if the matrix is not
-     * multiplication-compatible with instance.
-     */
-    protected void checkMultiplicationCompatible(final FieldMatrix<T> m)
-        throws DimensionMismatchException {
-        if (getColumnDimension() != m.getRowDimension()) {
-            throw new DimensionMismatchException(m.getRowDimension(), getColumnDimension());
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/commons-math/blob/a7b4803f/src/main/java/org/apache/commons/math3/linear/AbstractRealMatrix.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math3/linear/AbstractRealMatrix.java b/src/main/java/org/apache/commons/math3/linear/AbstractRealMatrix.java
deleted file mode 100644
index e0fc945..0000000
--- a/src/main/java/org/apache/commons/math3/linear/AbstractRealMatrix.java
+++ /dev/null
@@ -1,992 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.math3.linear;
-
-import java.util.ArrayList;
-import java.util.Locale;
-
-import org.apache.commons.math3.exception.NoDataException;
-import org.apache.commons.math3.exception.NotPositiveException;
-import org.apache.commons.math3.exception.NotStrictlyPositiveException;
-import org.apache.commons.math3.exception.DimensionMismatchException;
-import org.apache.commons.math3.exception.NullArgumentException;
-import org.apache.commons.math3.exception.NumberIsTooSmallException;
-import org.apache.commons.math3.exception.OutOfRangeException;
-import org.apache.commons.math3.exception.util.LocalizedFormats;
-import org.apache.commons.math3.util.MathUtils;
-import org.apache.commons.math3.util.FastMath;
-
-/**
- * Basic implementation of RealMatrix methods regardless of the underlying storage.
- * <p>All the methods implemented here use {@link #getEntry(int, int)} to access
- * matrix elements. Derived class can provide faster implementations.</p>
- *
- * @since 2.0
- */
-public abstract class AbstractRealMatrix
-    extends RealLinearOperator
-    implements RealMatrix {
-
-    /** Default format. */
-    private static final RealMatrixFormat DEFAULT_FORMAT = RealMatrixFormat.getInstance(Locale.US);
-    static {
-        // set the minimum fraction digits to 1 to keep compatibility
-        DEFAULT_FORMAT.getFormat().setMinimumFractionDigits(1);
-    }
-
-    /**
-     * Creates a matrix with no data
-     */
-    protected AbstractRealMatrix() {}
-
-    /**
-     * Create a new RealMatrix with the supplied row and column dimensions.
-     *
-     * @param rowDimension  the number of rows in the new matrix
-     * @param columnDimension  the number of columns in the new matrix
-     * @throws NotStrictlyPositiveException if row or column dimension is not positive
-     */
-    protected AbstractRealMatrix(final int rowDimension,
-        final int columnDimension)
-        throws NotStrictlyPositiveException {
-        if (rowDimension < 1) {
-            throw new NotStrictlyPositiveException(rowDimension);
-        }
-        if (columnDimension < 1) {
-            throw new NotStrictlyPositiveException(columnDimension);
-        }
-    }
-
-    /** {@inheritDoc} */
-    public RealMatrix add(RealMatrix m)
-        throws MatrixDimensionMismatchException {
-        MatrixUtils.checkAdditionCompatible(this, m);
-
-        final int rowCount    = getRowDimension();
-        final int columnCount = getColumnDimension();
-        final RealMatrix out = createMatrix(rowCount, columnCount);
-        for (int row = 0; row < rowCount; ++row) {
-            for (int col = 0; col < columnCount; ++col) {
-                out.setEntry(row, col, getEntry(row, col) + m.getEntry(row, col));
-            }
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public RealMatrix subtract(final RealMatrix m)
-        throws MatrixDimensionMismatchException {
-        MatrixUtils.checkSubtractionCompatible(this, m);
-
-        final int rowCount    = getRowDimension();
-        final int columnCount = getColumnDimension();
-        final RealMatrix out = createMatrix(rowCount, columnCount);
-        for (int row = 0; row < rowCount; ++row) {
-            for (int col = 0; col < columnCount; ++col) {
-                out.setEntry(row, col, getEntry(row, col) - m.getEntry(row, col));
-            }
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public RealMatrix scalarAdd(final double d) {
-        final int rowCount    = getRowDimension();
-        final int columnCount = getColumnDimension();
-        final RealMatrix out = createMatrix(rowCount, columnCount);
-        for (int row = 0; row < rowCount; ++row) {
-            for (int col = 0; col < columnCount; ++col) {
-                out.setEntry(row, col, getEntry(row, col) + d);
-            }
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public RealMatrix scalarMultiply(final double d) {
-        final int rowCount    = getRowDimension();
-        final int columnCount = getColumnDimension();
-        final RealMatrix out = createMatrix(rowCount, columnCount);
-        for (int row = 0; row < rowCount; ++row) {
-            for (int col = 0; col < columnCount; ++col) {
-                out.setEntry(row, col, getEntry(row, col) * d);
-            }
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public RealMatrix multiply(final RealMatrix m)
-        throws DimensionMismatchException {
-        MatrixUtils.checkMultiplicationCompatible(this, m);
-
-        final int nRows = getRowDimension();
-        final int nCols = m.getColumnDimension();
-        final int nSum  = getColumnDimension();
-        final RealMatrix out = createMatrix(nRows, nCols);
-        for (int row = 0; row < nRows; ++row) {
-            for (int col = 0; col < nCols; ++col) {
-                double sum = 0;
-                for (int i = 0; i < nSum; ++i) {
-                    sum += getEntry(row, i) * m.getEntry(i, col);
-                }
-                out.setEntry(row, col, sum);
-            }
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public RealMatrix preMultiply(final RealMatrix m)
-        throws DimensionMismatchException {
-        return m.multiply(this);
-    }
-
-    /** {@inheritDoc} */
-    public RealMatrix power(final int p)
-        throws NotPositiveException, NonSquareMatrixException {
-        if (p < 0) {
-            throw new NotPositiveException(LocalizedFormats.NOT_POSITIVE_EXPONENT, p);
-        }
-
-        if (!isSquare()) {
-            throw new NonSquareMatrixException(getRowDimension(), getColumnDimension());
-        }
-
-        if (p == 0) {
-            return MatrixUtils.createRealIdentityMatrix(this.getRowDimension());
-        }
-
-        if (p == 1) {
-            return this.copy();
-        }
-
-        final int power = p - 1;
-
-        /*
-         * Only log_2(p) operations is used by doing as follows:
-         * 5^214 = 5^128 * 5^64 * 5^16 * 5^4 * 5^2
-         *
-         * In general, the same approach is used for A^p.
-         */
-
-        final char[] binaryRepresentation = Integer.toBinaryString(power).toCharArray();
-        final ArrayList<Integer> nonZeroPositions = new ArrayList<Integer>();
-        int maxI = -1;
-
-        for (int i = 0; i < binaryRepresentation.length; ++i) {
-            if (binaryRepresentation[i] == '1') {
-                final int pos = binaryRepresentation.length - i - 1;
-                nonZeroPositions.add(pos);
-
-                // The positions are taken in turn, so maxI is only changed once
-                if (maxI == -1) {
-                    maxI = pos;
-                }
-            }
-        }
-
-        RealMatrix[] results = new RealMatrix[maxI + 1];
-        results[0] = this.copy();
-
-        for (int i = 1; i <= maxI; ++i) {
-            results[i] = results[i-1].multiply(results[i-1]);
-        }
-
-        RealMatrix result = this.copy();
-
-        for (Integer i : nonZeroPositions) {
-            result = result.multiply(results[i]);
-        }
-
-        return result;
-    }
-
-    /** {@inheritDoc} */
-    public double[][] getData() {
-        final double[][] data = new double[getRowDimension()][getColumnDimension()];
-
-        for (int i = 0; i < data.length; ++i) {
-            final double[] dataI = data[i];
-            for (int j = 0; j < dataI.length; ++j) {
-                dataI[j] = getEntry(i, j);
-            }
-        }
-
-        return data;
-    }
-
-    /** {@inheritDoc} */
-    public double getNorm() {
-        return walkInColumnOrder(new RealMatrixPreservingVisitor() {
-
-            /** Last row index. */
-            private double endRow;
-
-            /** Sum of absolute values on one column. */
-            private double columnSum;
-
-            /** Maximal sum across all columns. */
-            private double maxColSum;
-
-            /** {@inheritDoc} */
-            public void start(final int rows, final int columns,
-                              final int startRow, final int endRow,
-                              final int startColumn, final int endColumn) {
-                this.endRow = endRow;
-                columnSum   = 0;
-                maxColSum   = 0;
-            }
-
-            /** {@inheritDoc} */
-            public void visit(final int row, final int column, final double value) {
-                columnSum += FastMath.abs(value);
-                if (row == endRow) {
-                    maxColSum = FastMath.max(maxColSum, columnSum);
-                    columnSum = 0;
-                }
-            }
-
-            /** {@inheritDoc} */
-            public double end() {
-                return maxColSum;
-            }
-        });
-    }
-
-    /** {@inheritDoc} */
-    public double getFrobeniusNorm() {
-        return walkInOptimizedOrder(new RealMatrixPreservingVisitor() {
-
-            /** Sum of squared entries. */
-            private double sum;
-
-            /** {@inheritDoc} */
-            public void start(final int rows, final int columns,
-                              final int startRow, final int endRow,
-                              final int startColumn, final int endColumn) {
-                sum = 0;
-            }
-
-            /** {@inheritDoc} */
-            public void visit(final int row, final int column, final double value) {
-                sum += value * value;
-            }
-
-            /** {@inheritDoc} */
-            public double end() {
-                return FastMath.sqrt(sum);
-            }
-        });
-    }
-
-    /** {@inheritDoc} */
-    public RealMatrix getSubMatrix(final int startRow, final int endRow,
-                                   final int startColumn, final int endColumn)
-        throws OutOfRangeException, NumberIsTooSmallException {
-        MatrixUtils.checkSubMatrixIndex(this, startRow, endRow, startColumn, endColumn);
-
-        final RealMatrix subMatrix =
-            createMatrix(endRow - startRow + 1, endColumn - startColumn + 1);
-        for (int i = startRow; i <= endRow; ++i) {
-            for (int j = startColumn; j <= endColumn; ++j) {
-                subMatrix.setEntry(i - startRow, j - startColumn, getEntry(i, j));
-            }
-        }
-
-        return subMatrix;
-    }
-
-    /** {@inheritDoc} */
-    public RealMatrix getSubMatrix(final int[] selectedRows,
-                                   final int[] selectedColumns)
-        throws NullArgumentException, NoDataException, OutOfRangeException {
-        MatrixUtils.checkSubMatrixIndex(this, selectedRows, selectedColumns);
-
-        final RealMatrix subMatrix =
-            createMatrix(selectedRows.length, selectedColumns.length);
-        subMatrix.walkInOptimizedOrder(new DefaultRealMatrixChangingVisitor() {
-
-            /** {@inheritDoc} */
-            @Override
-            public double visit(final int row, final int column, final double value) {
-                return getEntry(selectedRows[row], selectedColumns[column]);
-            }
-
-        });
-
-        return subMatrix;
-    }
-
-    /** {@inheritDoc} */
-    public void copySubMatrix(final int startRow, final int endRow,
-                              final int startColumn, final int endColumn,
-                              final double[][] destination)
-        throws OutOfRangeException, NumberIsTooSmallException,
-        MatrixDimensionMismatchException {
-        MatrixUtils.checkSubMatrixIndex(this, startRow, endRow, startColumn, endColumn);
-        final int rowsCount    = endRow + 1 - startRow;
-        final int columnsCount = endColumn + 1 - startColumn;
-        if ((destination.length < rowsCount) || (destination[0].length < columnsCount)) {
-            throw new MatrixDimensionMismatchException(destination.length, destination[0].length,
-                                                       rowsCount, columnsCount);
-        }
-
-        for (int i = 1; i < rowsCount; i++) {
-            if (destination[i].length < columnsCount) {
-                throw new MatrixDimensionMismatchException(destination.length, destination[i].length,
-                                                           rowsCount, columnsCount);
-            }
-        }
-
-        walkInOptimizedOrder(new DefaultRealMatrixPreservingVisitor() {
-
-            /** Initial row index. */
-            private int startRow;
-
-            /** Initial column index. */
-            private int startColumn;
-
-            /** {@inheritDoc} */
-            @Override
-            public void start(final int rows, final int columns,
-                              final int startRow, final int endRow,
-                              final int startColumn, final int endColumn) {
-                this.startRow    = startRow;
-                this.startColumn = startColumn;
-            }
-
-            /** {@inheritDoc} */
-            @Override
-            public void visit(final int row, final int column, final double value) {
-                destination[row - startRow][column - startColumn] = value;
-            }
-
-        }, startRow, endRow, startColumn, endColumn);
-    }
-
-    /** {@inheritDoc} */
-    public void copySubMatrix(int[] selectedRows, int[] selectedColumns,
-                              double[][] destination)
-        throws OutOfRangeException, NullArgumentException, NoDataException,
-        MatrixDimensionMismatchException {
-        MatrixUtils.checkSubMatrixIndex(this, selectedRows, selectedColumns);
-        final int nCols = selectedColumns.length;
-        if ((destination.length < selectedRows.length) ||
-            (destination[0].length < nCols)) {
-            throw new MatrixDimensionMismatchException(destination.length, destination[0].length,
-                                                       selectedRows.length, selectedColumns.length);
-        }
-
-        for (int i = 0; i < selectedRows.length; i++) {
-            final double[] destinationI = destination[i];
-            if (destinationI.length < nCols) {
-                throw new MatrixDimensionMismatchException(destination.length, destinationI.length,
-                                                           selectedRows.length, selectedColumns.length);
-            }
-            for (int j = 0; j < selectedColumns.length; j++) {
-                destinationI[j] = getEntry(selectedRows[i], selectedColumns[j]);
-            }
-        }
-    }
-
-    /** {@inheritDoc} */
-    public void setSubMatrix(final double[][] subMatrix, final int row, final int column)
-        throws NoDataException, OutOfRangeException,
-        DimensionMismatchException, NullArgumentException {
-        MathUtils.checkNotNull(subMatrix);
-        final int nRows = subMatrix.length;
-        if (nRows == 0) {
-            throw new NoDataException(LocalizedFormats.AT_LEAST_ONE_ROW);
-        }
-
-        final int nCols = subMatrix[0].length;
-        if (nCols == 0) {
-            throw new NoDataException(LocalizedFormats.AT_LEAST_ONE_COLUMN);
-        }
-
-        for (int r = 1; r < nRows; ++r) {
-            if (subMatrix[r].length != nCols) {
-                throw new DimensionMismatchException(nCols, subMatrix[r].length);
-            }
-        }
-
-        MatrixUtils.checkRowIndex(this, row);
-        MatrixUtils.checkColumnIndex(this, column);
-        MatrixUtils.checkRowIndex(this, nRows + row - 1);
-        MatrixUtils.checkColumnIndex(this, nCols + column - 1);
-
-        for (int i = 0; i < nRows; ++i) {
-            for (int j = 0; j < nCols; ++j) {
-                setEntry(row + i, column + j, subMatrix[i][j]);
-            }
-        }
-    }
-
-    /** {@inheritDoc} */
-    public RealMatrix getRowMatrix(final int row) throws OutOfRangeException {
-        MatrixUtils.checkRowIndex(this, row);
-        final int nCols = getColumnDimension();
-        final RealMatrix out = createMatrix(1, nCols);
-        for (int i = 0; i < nCols; ++i) {
-            out.setEntry(0, i, getEntry(row, i));
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public void setRowMatrix(final int row, final RealMatrix matrix)
-        throws OutOfRangeException, MatrixDimensionMismatchException {
-        MatrixUtils.checkRowIndex(this, row);
-        final int nCols = getColumnDimension();
-        if ((matrix.getRowDimension() != 1) ||
-            (matrix.getColumnDimension() != nCols)) {
-            throw new MatrixDimensionMismatchException(matrix.getRowDimension(),
-                                                       matrix.getColumnDimension(),
-                                                       1, nCols);
-        }
-        for (int i = 0; i < nCols; ++i) {
-            setEntry(row, i, matrix.getEntry(0, i));
-        }
-    }
-
-    /** {@inheritDoc} */
-    public RealMatrix getColumnMatrix(final int column)
-        throws OutOfRangeException {
-        MatrixUtils.checkColumnIndex(this, column);
-        final int nRows = getRowDimension();
-        final RealMatrix out = createMatrix(nRows, 1);
-        for (int i = 0; i < nRows; ++i) {
-            out.setEntry(i, 0, getEntry(i, column));
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public void setColumnMatrix(final int column, final RealMatrix matrix)
-        throws OutOfRangeException, MatrixDimensionMismatchException {
-        MatrixUtils.checkColumnIndex(this, column);
-        final int nRows = getRowDimension();
-        if ((matrix.getRowDimension() != nRows) ||
-            (matrix.getColumnDimension() != 1)) {
-            throw new MatrixDimensionMismatchException(matrix.getRowDimension(),
-                                                       matrix.getColumnDimension(),
-                                                       nRows, 1);
-        }
-        for (int i = 0; i < nRows; ++i) {
-            setEntry(i, column, matrix.getEntry(i, 0));
-        }
-    }
-
-    /** {@inheritDoc} */
-    public RealVector getRowVector(final int row)
-        throws OutOfRangeException {
-        return new ArrayRealVector(getRow(row), false);
-    }
-
-    /** {@inheritDoc} */
-    public void setRowVector(final int row, final RealVector vector)
-        throws OutOfRangeException, MatrixDimensionMismatchException {
-        MatrixUtils.checkRowIndex(this, row);
-        final int nCols = getColumnDimension();
-        if (vector.getDimension() != nCols) {
-            throw new MatrixDimensionMismatchException(1, vector.getDimension(),
-                                                       1, nCols);
-        }
-        for (int i = 0; i < nCols; ++i) {
-            setEntry(row, i, vector.getEntry(i));
-        }
-    }
-
-    /** {@inheritDoc} */
-    public RealVector getColumnVector(final int column)
-        throws OutOfRangeException {
-        return new ArrayRealVector(getColumn(column), false);
-    }
-
-    /** {@inheritDoc} */
-    public void setColumnVector(final int column, final RealVector vector)
-        throws OutOfRangeException, MatrixDimensionMismatchException {
-        MatrixUtils.checkColumnIndex(this, column);
-        final int nRows = getRowDimension();
-        if (vector.getDimension() != nRows) {
-            throw new MatrixDimensionMismatchException(vector.getDimension(), 1,
-                                                       nRows, 1);
-        }
-        for (int i = 0; i < nRows; ++i) {
-            setEntry(i, column, vector.getEntry(i));
-        }
-    }
-
-    /** {@inheritDoc} */
-    public double[] getRow(final int row) throws OutOfRangeException {
-        MatrixUtils.checkRowIndex(this, row);
-        final int nCols = getColumnDimension();
-        final double[] out = new double[nCols];
-        for (int i = 0; i < nCols; ++i) {
-            out[i] = getEntry(row, i);
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public void setRow(final int row, final double[] array)
-        throws OutOfRangeException, MatrixDimensionMismatchException {
-        MatrixUtils.checkRowIndex(this, row);
-        final int nCols = getColumnDimension();
-        if (array.length != nCols) {
-            throw new MatrixDimensionMismatchException(1, array.length, 1, nCols);
-        }
-        for (int i = 0; i < nCols; ++i) {
-            setEntry(row, i, array[i]);
-        }
-    }
-
-    /** {@inheritDoc} */
-    public double[] getColumn(final int column) throws OutOfRangeException {
-        MatrixUtils.checkColumnIndex(this, column);
-        final int nRows = getRowDimension();
-        final double[] out = new double[nRows];
-        for (int i = 0; i < nRows; ++i) {
-            out[i] = getEntry(i, column);
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public void setColumn(final int column, final double[] array)
-        throws OutOfRangeException, MatrixDimensionMismatchException {
-        MatrixUtils.checkColumnIndex(this, column);
-        final int nRows = getRowDimension();
-        if (array.length != nRows) {
-            throw new MatrixDimensionMismatchException(array.length, 1, nRows, 1);
-        }
-        for (int i = 0; i < nRows; ++i) {
-            setEntry(i, column, array[i]);
-        }
-    }
-
-    /** {@inheritDoc} */
-    public void addToEntry(int row, int column, double increment)
-        throws OutOfRangeException {
-        MatrixUtils.checkMatrixIndex(this, row, column);
-        setEntry(row, column, getEntry(row, column) + increment);
-    }
-
-    /** {@inheritDoc} */
-    public void multiplyEntry(int row, int column, double factor)
-        throws OutOfRangeException {
-        MatrixUtils.checkMatrixIndex(this, row, column);
-        setEntry(row, column, getEntry(row, column) * factor);
-    }
-
-    /** {@inheritDoc} */
-    public RealMatrix transpose() {
-        final int nRows = getRowDimension();
-        final int nCols = getColumnDimension();
-        final RealMatrix out = createMatrix(nCols, nRows);
-        walkInOptimizedOrder(new DefaultRealMatrixPreservingVisitor() {
-
-            /** {@inheritDoc} */
-            @Override
-            public void visit(final int row, final int column, final double value) {
-                out.setEntry(column, row, value);
-            }
-
-        });
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public boolean isSquare() {
-        return getColumnDimension() == getRowDimension();
-    }
-
-    /**
-     * Returns the number of rows of this matrix.
-     *
-     * @return the number of rows.
-     */
-    @Override
-    public abstract int getRowDimension();
-
-    /**
-     * Returns the number of columns of this matrix.
-     *
-     * @return the number of columns.
-     */
-    @Override
-    public abstract int getColumnDimension();
-
-    /** {@inheritDoc} */
-    public double getTrace() throws NonSquareMatrixException {
-        final int nRows = getRowDimension();
-        final int nCols = getColumnDimension();
-        if (nRows != nCols) {
-            throw new NonSquareMatrixException(nRows, nCols);
-       }
-        double trace = 0;
-        for (int i = 0; i < nRows; ++i) {
-            trace += getEntry(i, i);
-        }
-        return trace;
-    }
-
-    /** {@inheritDoc} */
-    public double[] operate(final double[] v)
-        throws DimensionMismatchException {
-        final int nRows = getRowDimension();
-        final int nCols = getColumnDimension();
-        if (v.length != nCols) {
-            throw new DimensionMismatchException(v.length, nCols);
-        }
-
-        final double[] out = new double[nRows];
-        for (int row = 0; row < nRows; ++row) {
-            double sum = 0;
-            for (int i = 0; i < nCols; ++i) {
-                sum += getEntry(row, i) * v[i];
-            }
-            out[row] = sum;
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public RealVector operate(final RealVector v)
-        throws DimensionMismatchException {
-        try {
-            return new ArrayRealVector(operate(((ArrayRealVector) v).getDataRef()), false);
-        } catch (ClassCastException cce) {
-            final int nRows = getRowDimension();
-            final int nCols = getColumnDimension();
-            if (v.getDimension() != nCols) {
-                throw new DimensionMismatchException(v.getDimension(), nCols);
-            }
-
-            final double[] out = new double[nRows];
-            for (int row = 0; row < nRows; ++row) {
-                double sum = 0;
-                for (int i = 0; i < nCols; ++i) {
-                    sum += getEntry(row, i) * v.getEntry(i);
-                }
-                out[row] = sum;
-            }
-
-            return new ArrayRealVector(out, false);
-        }
-    }
-
-    /** {@inheritDoc} */
-    public double[] preMultiply(final double[] v) throws DimensionMismatchException {
-
-        final int nRows = getRowDimension();
-        final int nCols = getColumnDimension();
-        if (v.length != nRows) {
-            throw new DimensionMismatchException(v.length, nRows);
-        }
-
-        final double[] out = new double[nCols];
-        for (int col = 0; col < nCols; ++col) {
-            double sum = 0;
-            for (int i = 0; i < nRows; ++i) {
-                sum += getEntry(i, col) * v[i];
-            }
-            out[col] = sum;
-        }
-
-        return out;
-    }
-
-    /** {@inheritDoc} */
-    public RealVector preMultiply(final RealVector v) throws DimensionMismatchException {
-        try {
-            return new ArrayRealVector(preMultiply(((ArrayRealVector) v).getDataRef()), false);
-        } catch (ClassCastException cce) {
-
-            final int nRows = getRowDimension();
-            final int nCols = getColumnDimension();
-            if (v.getDimension() != nRows) {
-                throw new DimensionMismatchException(v.getDimension(), nRows);
-            }
-
-            final double[] out = new double[nCols];
-            for (int col = 0; col < nCols; ++col) {
-                double sum = 0;
-                for (int i = 0; i < nRows; ++i) {
-                    sum += getEntry(i, col) * v.getEntry(i);
-                }
-                out[col] = sum;
-            }
-
-            return new ArrayRealVector(out, false);
-        }
-    }
-
-    /** {@inheritDoc} */
-    public double walkInRowOrder(final RealMatrixChangingVisitor visitor) {
-        final int rows    = getRowDimension();
-        final int columns = getColumnDimension();
-        visitor.start(rows, columns, 0, rows - 1, 0, columns - 1);
-        for (int row = 0; row < rows; ++row) {
-            for (int column = 0; column < columns; ++column) {
-                final double oldValue = getEntry(row, column);
-                final double newValue = visitor.visit(row, column, oldValue);
-                setEntry(row, column, newValue);
-            }
-        }
-        return visitor.end();
-    }
-
-    /** {@inheritDoc} */
-    public double walkInRowOrder(final RealMatrixPreservingVisitor visitor) {
-        final int rows    = getRowDimension();
-        final int columns = getColumnDimension();
-        visitor.start(rows, columns, 0, rows - 1, 0, columns - 1);
-        for (int row = 0; row < rows; ++row) {
-            for (int column = 0; column < columns; ++column) {
-                visitor.visit(row, column, getEntry(row, column));
-            }
-        }
-        return visitor.end();
-    }
-
-    /** {@inheritDoc} */
-    public double walkInRowOrder(final RealMatrixChangingVisitor visitor,
-                                 final int startRow, final int endRow,
-                                 final int startColumn, final int endColumn)
-        throws OutOfRangeException, NumberIsTooSmallException {
-        MatrixUtils.checkSubMatrixIndex(this, startRow, endRow, startColumn, endColumn);
-        visitor.start(getRowDimension(), getColumnDimension(),
-                      startRow, endRow, startColumn, endColumn);
-        for (int row = startRow; row <= endRow; ++row) {
-            for (int column = startColumn; column <= endColumn; ++column) {
-                final double oldValue = getEntry(row, column);
-                final double newValue = visitor.visit(row, column, oldValue);
-                setEntry(row, column, newValue);
-            }
-        }
-        return visitor.end();
-    }
-
-    /** {@inheritDoc} */
-    public double walkInRowOrder(final RealMatrixPreservingVisitor visitor,
-                                 final int startRow, final int endRow,
-                                 final int startColumn, final int endColumn)
-        throws OutOfRangeException, NumberIsTooSmallException {
-        MatrixUtils.checkSubMatrixIndex(this, startRow, endRow, startColumn, endColumn);
-        visitor.start(getRowDimension(), getColumnDimension(),
-                      startRow, endRow, startColumn, endColumn);
-        for (int row = startRow; row <= endRow; ++row) {
-            for (int column = startColumn; column <= endColumn; ++column) {
-                visitor.visit(row, column, getEntry(row, column));
-            }
-        }
-        return visitor.end();
-    }
-
-    /** {@inheritDoc} */
-    public double walkInColumnOrder(final RealMatrixChangingVisitor visitor) {
-        final int rows    = getRowDimension();
-        final int columns = getColumnDimension();
-        visitor.start(rows, columns, 0, rows - 1, 0, columns - 1);
-        for (int column = 0; column < columns; ++column) {
-            for (int row = 0; row < rows; ++row) {
-                final double oldValue = getEntry(row, column);
-                final double newValue = visitor.visit(row, column, oldValue);
-                setEntry(row, column, newValue);
-            }
-        }
-        return visitor.end();
-    }
-
-    /** {@inheritDoc} */
-    public double walkInColumnOrder(final RealMatrixPreservingVisitor visitor) {
-        final int rows    = getRowDimension();
-        final int columns = getColumnDimension();
-        visitor.start(rows, columns, 0, rows - 1, 0, columns - 1);
-        for (int column = 0; column < columns; ++column) {
-            for (int row = 0; row < rows; ++row) {
-                visitor.visit(row, column, getEntry(row, column));
-            }
-        }
-        return visitor.end();
-    }
-
-    /** {@inheritDoc} */
-    public double walkInColumnOrder(final RealMatrixChangingVisitor visitor,
-                                    final int startRow, final int endRow,
-                                    final int startColumn, final int endColumn)
-        throws OutOfRangeException, NumberIsTooSmallException {
-        MatrixUtils.checkSubMatrixIndex(this, startRow, endRow, startColumn, endColumn);
-        visitor.start(getRowDimension(), getColumnDimension(),
-                      startRow, endRow, startColumn, endColumn);
-        for (int column = startColumn; column <= endColumn; ++column) {
-            for (int row = startRow; row <= endRow; ++row) {
-                final double oldValue = getEntry(row, column);
-                final double newValue = visitor.visit(row, column, oldValue);
-                setEntry(row, column, newValue);
-            }
-        }
-        return visitor.end();
-    }
-
-    /** {@inheritDoc} */
-    public double walkInColumnOrder(final RealMatrixPreservingVisitor visitor,
-                                    final int startRow, final int endRow,
-                                    final int startColumn, final int endColumn)
-        throws OutOfRangeException, NumberIsTooSmallException {
-        MatrixUtils.checkSubMatrixIndex(this, startRow, endRow, startColumn, endColumn);
-        visitor.start(getRowDimension(), getColumnDimension(),
-                      startRow, endRow, startColumn, endColumn);
-        for (int column = startColumn; column <= endColumn; ++column) {
-            for (int row = startRow; row <= endRow; ++row) {
-                visitor.visit(row, column, getEntry(row, column));
-            }
-        }
-        return visitor.end();
-    }
-
-    /** {@inheritDoc} */
-    public double walkInOptimizedOrder(final RealMatrixChangingVisitor visitor) {
-        return walkInRowOrder(visitor);
-    }
-
-    /** {@inheritDoc} */
-    public double walkInOptimizedOrder(final RealMatrixPreservingVisitor visitor) {
-        return walkInRowOrder(visitor);
-    }
-
-    /** {@inheritDoc} */
-    public double walkInOptimizedOrder(final RealMatrixChangingVisitor visitor,
-                                       final int startRow, final int endRow,
-                                       final int startColumn,
-                                       final int endColumn)
-        throws OutOfRangeException, NumberIsTooSmallException {
-        return walkInRowOrder(visitor, startRow, endRow, startColumn, endColumn);
-    }
-
-    /** {@inheritDoc} */
-    public double walkInOptimizedOrder(final RealMatrixPreservingVisitor visitor,
-                                       final int startRow, final int endRow,
-                                       final int startColumn,
-                                       final int endColumn)
-        throws OutOfRangeException, NumberIsTooSmallException {
-        return walkInRowOrder(visitor, startRow, endRow, startColumn, endColumn);
-    }
-
-    /**
-     * Get a string representation for this matrix.
-     * @return a string representation for this matrix
-     */
-    @Override
-    public String toString() {
-        final StringBuilder res = new StringBuilder();
-        String fullClassName = getClass().getName();
-        String shortClassName = fullClassName.substring(fullClassName.lastIndexOf('.') + 1);
-        res.append(shortClassName);
-        res.append(DEFAULT_FORMAT.format(this));
-        return res.toString();
-    }
-
-    /**
-     * Returns true iff <code>object</code> is a
-     * <code>RealMatrix</code> instance with the same dimensions as this
-     * and all corresponding matrix entries are equal.
-     *
-     * @param object the object to test equality against.
-     * @return true if object equals this
-     */
-    @Override
-    public boolean equals(final Object object) {
-        if (object == this ) {
-            return true;
-        }
-        if (object instanceof RealMatrix == false) {
-            return false;
-        }
-        RealMatrix m = (RealMatrix) object;
-        final int nRows = getRowDimension();
-        final int nCols = getColumnDimension();
-        if (m.getColumnDimension() != nCols || m.getRowDimension() != nRows) {
-            return false;
-        }
-        for (int row = 0; row < nRows; ++row) {
-            for (int col = 0; col < nCols; ++col) {
-                if (getEntry(row, col) != m.getEntry(row, col)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Computes a hashcode for the matrix.
-     *
-     * @return hashcode for matrix
-     */
-    @Override
-    public int hashCode() {
-        int ret = 7;
-        final int nRows = getRowDimension();
-        final int nCols = getColumnDimension();
-        ret = ret * 31 + nRows;
-        ret = ret * 31 + nCols;
-        for (int row = 0; row < nRows; ++row) {
-            for (int col = 0; col < nCols; ++col) {
-               ret = ret * 31 + (11 * (row+1) + 17 * (col+1)) *
-                   MathUtils.hash(getEntry(row, col));
-           }
-        }
-        return ret;
-    }
-
-
-    /*
-     * Empty implementations of these methods are provided in order to allow for
-     * the use of the @Override tag with Java 1.5.
-     */
-
-    /** {@inheritDoc} */
-    public abstract RealMatrix createMatrix(int rowDimension, int columnDimension)
-        throws NotStrictlyPositiveException;
-
-    /** {@inheritDoc} */
-    public abstract RealMatrix copy();
-
-    /** {@inheritDoc} */
-    public abstract double getEntry(int row, int column)
-        throws OutOfRangeException;
-
-    /** {@inheritDoc} */
-    public abstract void setEntry(int row, int column, double value)
-        throws OutOfRangeException;
-}

http://git-wip-us.apache.org/repos/asf/commons-math/blob/a7b4803f/src/main/java/org/apache/commons/math3/linear/AnyMatrix.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math3/linear/AnyMatrix.java b/src/main/java/org/apache/commons/math3/linear/AnyMatrix.java
deleted file mode 100644
index 736819a..0000000
--- a/src/main/java/org/apache/commons/math3/linear/AnyMatrix.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.math3.linear;
-
-
-/**
- * Interface defining very basic matrix operations.
- * @since 2.0
- */
-public interface AnyMatrix {
-
-    /**
-     * Is this a square matrix?
-     * @return true if the matrix is square (rowDimension = columnDimension)
-     */
-    boolean isSquare();
-
-    /**
-     * Returns the number of rows in the matrix.
-     *
-     * @return rowDimension
-     */
-    int getRowDimension();
-
-    /**
-     * Returns the number of columns in the matrix.
-     *
-     * @return columnDimension
-     */
-    int getColumnDimension();
-
-}