⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 determinant.java

📁 JAVA 数学程序库 提供常规的数值计算程序包
💻 JAVA
字号:
package jmathlib.toolbox.jmathlib.matrix;

import jmathlib.core.tokens.*;
import jmathlib.core.tokens.numbertokens.DoubleNumberToken;
import jmathlib.core.functions.ExternalFunction;

/**An external function for determining the determinant of a matrix*/
public class determinant extends ExternalFunction
{
	/**Check that the parameter is a square matrix then claculate
	it's determinant*/
	public OperandToken evaluate(Token[] operands)
	{
		OperandToken result = null;
        
        if (getNArgIn(operands) != 1)
			throwMathLibException("Determinant: number of arguments != 1");
            
		Token operand = operands[0];
		
		if(operand instanceof DoubleNumberToken)
		{
			DoubleNumberToken matrix = ((DoubleNumberToken)operand);
			
			if(matrix.getSizeX() == matrix.getSizeY())
			{
				int size = matrix.getSizeX();
				
				result = new DoubleNumberToken(calcDeterminant(matrix.getReValues(), size));
			}
	        else
	        {
	            jmathlib.core.interpreter.Errors.throwMathLibException(ERR_NOT_SQUARE_MATRIX);
	        }			
		}
		
		return result;
	}
	
	/**Function to actually calculate the determinant
	values 	= array of values
	size 	= the size of the matrix
	result 	= the determinant */
	private double calcDeterminant(double[][] values, int size)
	{
		jmathlib.core.interpreter.ErrorLogger.debugLine("calculating determinant - size = " + size);
		double result = 0;
		if(size == 1)		//special case 1, a scalar value
		{
			result = values[0][0];
		}
		else if(size == 2)	//special case 2, a 2*2 matrix
		{
			result = values[0][0] * values[1][1] - values[1][0] * values[0][1];
		}
		else				//calculate the determinant of an larger matrix
		{					//using recursion
			for(int colNumber = 0; colNumber < size; colNumber++)
			{
				//construct the sub matrix
				double[][] newMatrix = constructMatrix(values, size, colNumber);
	
				int modifier = -1;
				if(colNumber % 2 == 0)
					modifier = 1;
								
				result += modifier * values[0][colNumber] * calcDeterminant(newMatrix, size - 1);
			}
		}
		
		return result;
	}
	
	/**constructs a sub matrix
	values = the array of values
	size   = the size of the origional matrix
	column = the column to remove
	result = the [size-1][size-1] array of values after reomoving
			  row 1 and the specified column*/
	private double[][] constructMatrix(double[][]values, int size, int column)
	{
		jmathlib.core.interpreter.ErrorLogger.debugLine("Creating new matrix - size = " + size);
		double newMatrix[][] = new double[size-1][size-1];
		
		for(int rowNumber = 1; rowNumber < size; rowNumber++)
		{
			for(int colNumber = 0; colNumber < size; colNumber++)
			{
				if(colNumber < column)
					newMatrix[rowNumber-1][colNumber] = values[rowNumber][colNumber];
				else if(colNumber > column)
					newMatrix[rowNumber-1][colNumber-1] = values[rowNumber][colNumber];
					
			}
		}
		return newMatrix;
	}
}

/*
@GROUP
matrix
@SYNTAX
answer = DETERMINANT(square matrix)
@DOC
Returns the determinant for the first operand which must be a square matrix.
@NOTES
@EXAMPLES
DETERMINANT([1,0;0,1]) = 1
DETERMINANT([1,2;3,4]) = -2
@SEE
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -