You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2012/12/29 14:11:52 UTC
svn commit: r1426757 -
/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/DiagonalMatrix.java
Author: erans
Date: Sat Dec 29 13:11:51 2012
New Revision: 1426757
URL: http://svn.apache.org/viewvc?rev=1426757&view=rev
Log:
MATH-925
Minimal implementation of a diagonal matrix. Unit tests are lacking.
Added:
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/DiagonalMatrix.java (with props)
Added: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/DiagonalMatrix.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/DiagonalMatrix.java?rev=1426757&view=auto
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/DiagonalMatrix.java (added)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/DiagonalMatrix.java Sat Dec 29 13:11:51 2012
@@ -0,0 +1,376 @@
+/*
+ * 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.io.Serializable;
+import org.apache.commons.math3.exception.DimensionMismatchException;
+import org.apache.commons.math3.exception.NotStrictlyPositiveException;
+import org.apache.commons.math3.exception.OutOfRangeException;
+import org.apache.commons.math3.exception.MathUnsupportedOperationException;
+
+/**
+ * Implementation of a diagonal matrix.
+ * <br/>
+ * Caveat: This implementation is minimal; it is currently solely aimed
+ * at solving issue MATH-924. In particular many methods just throw
+ * {@code MathUnsupportedOperationException}.
+ *
+ * @version $Id$
+ */
+public class DiagonalMatrix extends AbstractRealMatrix
+ implements Serializable {
+ /** Serializable version identifier. */
+ private static final long serialVersionUID = 20121229L;
+ /** Entries of the diagonal. */
+ private double[] data;
+
+ /**
+ * Creates a matrix with no data.
+ */
+ public DiagonalMatrix() {}
+
+ /**
+ * Creates a matrix with the supplied dimension.
+ *
+ * @param dimension Number of rows and columns in the new matrix.
+ * @param columnDimension Number of columns in the new matrix.
+ * @throws NotStrictlyPositiveException if the dimension is
+ * not positive.
+ */
+ public DiagonalMatrix(final int dimension)
+ throws NotStrictlyPositiveException {
+ super(dimension, dimension);
+ data = new double[dimension];
+ }
+
+ /**
+ * Creates a matrix using the input array as the underlying data.
+ * <br/>
+ * The input array is copied, not referenced.
+ *
+ * @param d Data for the new matrix.
+ */
+ public DiagonalMatrix(final double[] d) {
+ data = d.clone();
+ }
+
+ /**
+ * Creates a matrix using the input array as the underlying data.
+ * <br/>
+ * If an array is built specially in order to be embedded in a
+ * RealMatrix and not used directly, the {@code copyArray} may be
+ * set to {@code false}. This will prevent the copying and improve
+ * performance as no new array will be built and no data will be copied.
+ *
+ * @param d Data for new matrix.
+ * @param copyArray if {@code true}, the input array will be copied,
+ * otherwise it will be referenced.
+ */
+ public DiagonalMatrix(final double[] d, final boolean copyArray) {
+ data = copyArray ? d.clone() : d;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @throws DimensionMismatchException if the requested dimensions are not equal.
+ */
+ @Override
+ public RealMatrix createMatrix(final int rowDimension,
+ final int columnDimension)
+ throws NotStrictlyPositiveException,
+ DimensionMismatchException {
+ if (rowDimension != columnDimension) {
+ throw new DimensionMismatchException(rowDimension, columnDimension);
+ }
+
+ return new DiagonalMatrix(rowDimension);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public RealMatrix copy() {
+ return new DiagonalMatrix(data);
+ }
+
+ /**
+ * Compute the sum of {@code this} and {@code m}.
+ *
+ * @param m Matrix to be added.
+ * @return {@code this + m}.
+ * @throws MatrixDimensionMismatchException if {@code m} is not the same
+ * size as {@code this}.
+ */
+ public DiagonalMatrix add(final DiagonalMatrix m)
+ throws MatrixDimensionMismatchException {
+ // Safety check.
+ MatrixUtils.checkAdditionCompatible(this, m);
+
+ final int dim = getRowDimension();
+ final double[] outData = new double[dim];
+ for (int i = 0; i < dim; i++) {
+ outData[i] = data[i] + m.data[i];
+ }
+
+ return new DiagonalMatrix(outData, false);
+ }
+
+ /**
+ * Returns {@code this} minus {@code m}.
+ *
+ * @param m Matrix to be subtracted.
+ * @return {@code this - m}
+ * @throws MatrixDimensionMismatchException if {@code m} is not the same
+ * size as {@code this}.
+ */
+ public DiagonalMatrix subtract(final DiagonalMatrix m)
+ throws MatrixDimensionMismatchException {
+ MatrixUtils.checkSubtractionCompatible(this, m);
+
+ final int dim = getRowDimension();
+ final double[] outData = new double[dim];
+ for (int i = 0; i < dim; i++) {
+ outData[i] = data[i] - m.data[i];
+ }
+
+ return new DiagonalMatrix(outData, false);
+ }
+
+ /**
+ * Returns the result of postmultiplying {@code this} by {@code m}.
+ *
+ * @param m matrix to postmultiply by
+ * @return {@code this * m}
+ * @throws DimensionMismatchException if
+ * {@code columnDimension(this) != rowDimension(m)}
+ */
+ public DiagonalMatrix multiply(final DiagonalMatrix m)
+ throws DimensionMismatchException {
+ MatrixUtils.checkMultiplicationCompatible(this, m);
+
+ final int dim = getRowDimension();
+ final double[] outData = new double[dim];
+ for (int i = 0; i < dim; i++) {
+ outData[i] = data[i] * m.data[i];
+ }
+
+ return new DiagonalMatrix(outData, false);
+ }
+
+ /**
+ * Returns the result of postmultiplying {@code this} by {@code m}.
+ *
+ * @param m matrix to postmultiply by
+ * @return {@code this * m}
+ * @throws DimensionMismatchException if
+ * {@code columnDimension(this) != rowDimension(m)}
+ */
+ public RealMatrix multiply(final RealMatrix m)
+ throws DimensionMismatchException {
+ if (m instanceof DiagonalMatrix) {
+ return multiply((DiagonalMatrix) m);
+ } else {
+ MatrixUtils.checkMultiplicationCompatible(this, m);
+ final int nRows = m.getRowDimension();
+ final int nCols = m.getColumnDimension();
+ final double[][] product = new double[nRows][nCols];
+ for (int r = 0; r < nRows; r++) {
+ for (int c = 0; c < nCols; c++) {
+ product[r][c] = data[r] * m.getEntry(r, c);
+ }
+ }
+ return new Array2DRowRealMatrix(product, false);
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public double[][] getData() {
+ final int dim = getRowDimension();
+ final double[][] out = new double[dim][dim];
+
+ for (int i = 0; i < dim; i++) {
+ out[i][i] = data[i];
+ }
+
+ return out;
+ }
+
+ /**
+ * Gets a reference to the underlying data array.
+ *
+ * @return 1-dimensional array of entries.
+ */
+ public double[] getDataRef() {
+ return data;
+ }
+
+ /**
+ * @throws MathUnsupportedOperationException
+ */
+ @Override
+ public void setSubMatrix(final double[][] subMatrix,
+ final int row,
+ final int column)
+ throws MathUnsupportedOperationException {
+ throw new MathUnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public double getEntry(final int row, final int column)
+ throws OutOfRangeException {
+ MatrixUtils.checkMatrixIndex(this, row, column);
+ return row == column ? data[row] : 0;
+ }
+
+ /** {@inheritDoc}
+ * @throws MathUnsupportedOperationException if {@code row != column}.
+ */
+ @Override
+ public void setEntry(final int row, final int column, final double value)
+ throws OutOfRangeException,
+ MathUnsupportedOperationException {
+ if (row != column) {
+ throw new MathUnsupportedOperationException();
+ }
+ MatrixUtils.checkMatrixIndex(this, row, column);
+ data[row] = value;
+ }
+
+ /** {@inheritDoc}
+ * @throws MathUnsupportedOperationException if {@code row != column}.
+ */
+ @Override
+ public void addToEntry(final int row,
+ final int column,
+ final double increment)
+ throws OutOfRangeException,
+ MathUnsupportedOperationException {
+ if (row != column) {
+ throw new MathUnsupportedOperationException();
+ }
+ MatrixUtils.checkMatrixIndex(this, row, column);
+ data[row] += increment;
+ }
+
+ /** {@inheritDoc}
+ * @throws MathUnsupportedOperationException if {@code row != column}.
+ */
+ @Override
+ public void multiplyEntry(final int row,
+ final int column,
+ final double factor)
+ throws OutOfRangeException,
+ MathUnsupportedOperationException {
+ if (row != column) {
+ throw new MathUnsupportedOperationException();
+ }
+ MatrixUtils.checkMatrixIndex(this, row, column);
+ data[row] *= factor;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public int getRowDimension() {
+ return data == null ? 0 : data.length;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public int getColumnDimension() {
+ return getRowDimension();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public double[] operate(final double[] v)
+ throws DimensionMismatchException {
+ return multiply(new DiagonalMatrix(v, false)).getDataRef();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public double[] preMultiply(final double[] v)
+ throws DimensionMismatchException {
+ return operate(v);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public double walkInRowOrder(final RealMatrixChangingVisitor visitor)
+ throws MathUnsupportedOperationException {
+ throw new MathUnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public double walkInRowOrder(final RealMatrixPreservingVisitor visitor)
+ throws MathUnsupportedOperationException {
+ throw new MathUnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public double walkInRowOrder(final RealMatrixChangingVisitor visitor,
+ final int startRow, final int endRow,
+ final int startColumn, final int endColumn)
+ throws MathUnsupportedOperationException {
+ throw new MathUnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public double walkInRowOrder(final RealMatrixPreservingVisitor visitor,
+ final int startRow, final int endRow,
+ final int startColumn, final int endColumn)
+ throws MathUnsupportedOperationException {
+ throw new MathUnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public double walkInColumnOrder(final RealMatrixChangingVisitor visitor)
+ throws MathUnsupportedOperationException {
+ throw new MathUnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public double walkInColumnOrder(final RealMatrixPreservingVisitor visitor)
+ throws MathUnsupportedOperationException {
+ throw new MathUnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public double walkInColumnOrder(final RealMatrixChangingVisitor visitor,
+ final int startRow, final int endRow,
+ final int startColumn, final int endColumn)
+ throws MathUnsupportedOperationException {
+ throw new MathUnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public double walkInColumnOrder(final RealMatrixPreservingVisitor visitor,
+ final int startRow, final int endRow,
+ final int startColumn, final int endColumn)
+ throws MathUnsupportedOperationException {
+ throw new MathUnsupportedOperationException();
+ }
+}
Propchange: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/DiagonalMatrix.java
------------------------------------------------------------------------------
svn:eol-style = native