package org.matheclipse.core.reflection.system;

import org.matheclipse.core.eval.exception.Validate;
import org.matheclipse.core.eval.interfaces.AbstractFunctionEvaluator;
import org.matheclipse.core.eval.util.IndexFunctionDiagonal;
import org.matheclipse.core.eval.util.IndexTableGenerator;
import org.matheclipse.core.expression.F;
import org.matheclipse.core.interfaces.IAST;
import org.matheclipse.core.interfaces.IExpr;

/**
 * Create an identity matrix
 * 
 * See Wikipedia - Identity matrix
 */
public class IdentityMatrix extends AbstractFunctionEvaluator {

	public IdentityMatrix() {
	}

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

		if (ast.arg1().isInteger()) {
			int indx = Validate.checkIntType(ast, 1);
			final IExpr[] valueArray = { F.C0, F.C1 };
			return diagonalMatrix(valueArray, indx);
		}
		return null;
	}

	/**
	 * Create a diagonal matrix from valueArray[0] (non-diagonal elements) and valueArray[1] (diagonal
	 * elements).
	 * 
	 * @param valueArray
	 *            2 values for non-diagonal and diagonal elemnets of the matrix.
	 * @param dimension
	 *            of the square matrix
	 * 
	 * @return
	 */
	public static IAST diagonalMatrix(final IExpr[] valueArray, int dimension) {
		final IAST resultList = F.List();
		final int[] indexArray = new int[2];
		indexArray[0] = dimension;
		indexArray[1] = dimension;
		final IndexTableGenerator generator = new IndexTableGenerator(indexArray, resultList, new IndexFunctionDiagonal(
				valueArray));
		final IAST matrix = (IAST) generator.table();
		if (matrix != null) {
			matrix.addEvalFlags(IAST.IS_MATRIX);
		}
		return matrix;
	}
}

 

Ads help maintain this website.