package org.matheclipse.core.reflection.system;

import static org.matheclipse.core.expression.F.List;

import org.apache.commons.math3.linear.RealMatrix;
import org.matheclipse.core.basic.Config;
import org.matheclipse.core.convert.Convert;
import org.matheclipse.core.eval.exception.Validate;
import org.matheclipse.core.eval.interfaces.AbstractFunctionEvaluator;
import org.matheclipse.core.interfaces.IAST;
import org.matheclipse.core.interfaces.IExpr;

/**
 * 
 * See Wikipedia:
 * Singular value decomposition
 */
public class SingularValueDecomposition extends AbstractFunctionEvaluator {

	public SingularValueDecomposition() {
		super();
	}

	@Override
	public IExpr evaluate(final IAST ast) {
		Validate.checkSize(ast, 2);

		RealMatrix matrix;
		try {

			final IAST list = (IAST) ast.arg1();
			matrix = Convert.list2RealMatrix(list);
			final org.apache.commons.math3.linear.SingularValueDecomposition svd = new org.apache.commons.math3.linear.SingularValueDecomposition(
					matrix);
			final RealMatrix uMatrix = svd.getU();
			final RealMatrix sMatrix = svd.getS();
			final RealMatrix vMatrix = svd.getV();

			final IAST result = List();
			final IAST uMatrixAST = Convert.realMatrix2List(uMatrix);
			final IAST sMatrixAST = Convert.realMatrix2List(sMatrix);
			final IAST vMatrixAST = Convert.realMatrix2List(vMatrix);
			result.add(uMatrixAST);
			result.add(sMatrixAST);
			result.add(vMatrixAST);
			return result;

		} catch (final ClassCastException e) {
			if (Config.SHOW_STACKTRACE) {
				e.printStackTrace();
			}
		} catch (final IndexOutOfBoundsException e) {
			if (Config.SHOW_STACKTRACE) {
				e.printStackTrace();
			}
		}

		return null;
	}

	@Override
	public IExpr numericEval(final IAST functionList) {
		return evaluate(functionList);
	}

}
 

Ads help maintain this website.