001    /*
002     * Copyright (C) 2008-2010 by Holger Arndt
003     *
004     * This file is part of the Universal Java Matrix Package (UJMP).
005     * See the NOTICE file distributed with this work for additional
006     * information regarding copyright ownership and licensing.
007     *
008     * UJMP is free software; you can redistribute it and/or modify
009     * it under the terms of the GNU Lesser General Public License as
010     * published by the Free Software Foundation; either version 2
011     * of the License, or (at your option) any later version.
012     *
013     * UJMP is distributed in the hope that it will be useful,
014     * but WITHOUT ANY WARRANTY; without even the implied warranty of
015     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
016     * GNU Lesser General Public License for more details.
017     *
018     * You should have received a copy of the GNU Lesser General Public
019     * License along with UJMP; if not, write to the
020     * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
021     * Boston, MA  02110-1301  USA
022     */
023    
024    package org.ujmp.core.doublematrix.calculation.entrywise.basic;
025    
026    import org.ujmp.core.Coordinates;
027    import org.ujmp.core.Matrix;
028    import org.ujmp.core.MatrixFactory;
029    import org.ujmp.core.doublematrix.calculation.AbstractDoubleCalculation;
030    import org.ujmp.core.exceptions.MatrixException;
031    
032    public class Power extends AbstractDoubleCalculation {
033            private static final long serialVersionUID = -6766560469728046231L;
034    
035            public Power(Matrix m1, Matrix m2) {
036                    super(m1, m2);
037                    if (m2.isScalar() && !Coordinates.equals(m1.getSize(), m2.getSize())) {
038                            getSources()[1] = MatrixFactory.fill(m2.getAsDouble(0, 0), m1.getSize());
039                    }
040            }
041    
042            public Power(Matrix m1, double v2) throws MatrixException {
043                    this(m1, MatrixFactory.fill(v2, m1.getSize()));
044            }
045    
046            public double getDouble(long... coordinates) throws MatrixException {
047                    return Math.pow(getSource().getAsDouble(coordinates), getSources()[1]
048                                    .getAsDouble(coordinates));
049            }
050    
051            public static Matrix calc(Matrix source, Matrix power) throws MatrixException {
052                    if (power.isScalar() && !Coordinates.equals(source.getSize(), power.getSize())) {
053                            power = MatrixFactory.fill(power.getAsDouble(0, 0), source.getSize());
054                    }
055                    Matrix ret = Matrix.factory.zeros(source.getSize());
056                    for (long[] c : source.availableCoordinates()) {
057                            ret.setAsDouble(Math.pow(source.getAsDouble(c), power.getAsDouble(c)), c);
058                    }
059                    return ret;
060            }
061    
062            public static Matrix calc(Matrix source, double power) throws MatrixException {
063                    Matrix ret = Matrix.factory.zeros(source.getSize());
064                    for (long[] c : source.availableCoordinates()) {
065                            ret.setAsDouble(Math.pow(source.getAsDouble(c), power), c);
066                    }
067                    return ret;
068            }
069    
070    }