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.ejml.calculation; 025 026 import org.ejml.alg.dense.decomposition.DecompositionFactory; 027 import org.ejml.alg.dense.decomposition.QRDecomposition; 028 import org.ejml.alg.dense.linsol.LinearSolver; 029 import org.ejml.alg.dense.linsol.qr.LinearSolverQrHouseCol; 030 import org.ejml.data.DenseMatrix64F; 031 import org.ujmp.core.Matrix; 032 import org.ujmp.ejml.EJMLDenseDoubleMatrix2D; 033 034 public class QR implements 035 org.ujmp.core.doublematrix.calculation.general.decomposition.QR<Matrix> { 036 037 public static QR INSTANCE = new QR(); 038 039 public Matrix[] calc(Matrix source) { 040 QRDecomposition qr = DecompositionFactory.qr(); 041 DenseMatrix64F matrix = null; 042 if (source instanceof EJMLDenseDoubleMatrix2D) { 043 matrix = ((EJMLDenseDoubleMatrix2D) source).getWrappedObject(); 044 } else { 045 matrix = new EJMLDenseDoubleMatrix2D(source).getWrappedObject(); 046 } 047 qr.decompose(matrix); 048 DenseMatrix64F qm = qr.getQ(null, true); 049 DenseMatrix64F rm = qr.getR(null, true); 050 Matrix q = new EJMLDenseDoubleMatrix2D(qm); 051 Matrix r = new EJMLDenseDoubleMatrix2D(rm); 052 return new Matrix[] { q, r }; 053 } 054 055 public Matrix solve(Matrix a, Matrix b) { 056 LinearSolver solver = new LinearSolverQrHouseCol(); 057 DenseMatrix64F a2 = null; 058 DenseMatrix64F b2 = null; 059 if (a instanceof EJMLDenseDoubleMatrix2D) { 060 a2 = ((EJMLDenseDoubleMatrix2D) a).getWrappedObject(); 061 } else { 062 a2 = new EJMLDenseDoubleMatrix2D(a).getWrappedObject(); 063 } 064 if (b instanceof EJMLDenseDoubleMatrix2D) { 065 b2 = ((EJMLDenseDoubleMatrix2D) b).getWrappedObject(); 066 } else { 067 b2 = new EJMLDenseDoubleMatrix2D(b).getWrappedObject(); 068 } 069 solver.setA(a2); 070 DenseMatrix64F x = new DenseMatrix64F(a2.numCols, b2.numCols); 071 solver.solve(b2, x); 072 return new EJMLDenseDoubleMatrix2D(x); 073 } 074 075 }