package jmathlib.toolbox.general; import jmathlib.core.tokens.Token; import jmathlib.core.tokens.DataToken; import jmathlib.core.tokens.OperandToken; import jmathlib.core.tokens.numbertokens.DoubleNumberToken; import jmathlib.core.functions.ExternalFunction; import jmathlib.core.interpreter.GlobalValues; /**An external function for getting the size of matrices*/ public class size extends ExternalFunction { public OperandToken evaluate(Token[] operands, GlobalValues globals) { // at least one operand if ((getNArgIn(operands) < 1) || (getNArgIn(operands) > 2) ) throwMathLibException("size: number of arguments <1 or >2"); // first operand must be a number if (!(operands[0] instanceof DataToken)) throwMathLibException("size: argument must be a data token"); // get size array (e.g. [2,3,1] for 2x3x1 array int[] size = ((DataToken)operands[0]).getSize(); // e.g. size(A) -> [2,3,2] if (getNArgIn(operands)==1) { double[][] values = new double[1][size.length]; // copy size vector to return value for (int i=0; i<size.length; i++) values[0][i] = (double)size[i]; // return vector of sizes return new DoubleNumberToken(values); } // e.g. size([1,2,3],1) -> 1 // e.g. size([1,2,3],2) -> 3 // second operand must also be a number if (!(operands[1] instanceof DoubleNumberToken)) throwMathLibException("size: second argument must be a number token"); // retrieve requested dimension int n = (int)((DoubleNumberToken)operands[1]).getValueRe(0); // check index of dimension vector if ((n<1) || (n>size.length)) throwMathLibException("size: dimension not supported"); // return one element from size vector return new DoubleNumberToken(size[n-1]); } } /* @GROUP general @SYNTAX [y, x] = size(matrix) z = size(matrix, n) @DOC returns the size of a matrix. @EXAMPLES <programlisting> size([1,2;3,4]) = [2,2] size([1,2,3;4,5,6]) = [2,3] a=rand(4,4,2) size(a) -> [4,4,2) size(a,3) -> 2 </programlisting> @NOTES @SEE rows, columns, row, col, ndims */