/* * ComplexArray.java * * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.math; import dr.math.matrixAlgebra.Vector; /** * @author Marc A. Suchard */ public class ComplexArray { public final double[] real; public final double[] complex; public final int length; public ComplexArray(double[] real) { this(real, new double[real.length]); } public ComplexArray(double[] real, double[] complex) { this.real = real; this.complex = complex; this.length = real.length; } public void conjugate() { for (int i = 0; i < length; ++i) { complex[i] = -complex[i]; } } public ComplexArray product(ComplexArray x) { double[] newReal = new double[length]; double[] newComplex = new double[length]; for (int i = 0; i < length; ++i) { // (a + bi) * (c + di) = (ac - bd) + (ad + bc)i final double a = real[i]; final double b = complex[i]; final double c = x.real[i]; final double d = x.complex[i]; newReal[i] = a * c - b * d; newComplex[i] = a * d + b * c; } return new ComplexArray(newReal, newComplex); } public String toString() { return "\nReal : " + new Vector(real).toString() + "\nComplex: " + new Vector(complex).toString(); } public static double[] interleave(double[] real, double[] complex) { final int length = real.length; double[] out = new double[length * 2]; for (int i = 0; i < length; i++) { out[2 * i] = real[i]; out[2 * i + 1] = complex[i]; } return out; } }