find.java

来自「JAVA 数学程序库 提供常规的数值计算程序包」· Java 代码 · 共 141 行

JAVA
141
字号
package jmathlib.toolbox.jmathlib.matrix;

import jmathlib.core.tokens.Token;
import jmathlib.core.tokens.OperandToken;
import jmathlib.core.tokens.LogicalToken;
import jmathlib.core.tokens.numbertokens.DoubleNumberToken;
import jmathlib.core.functions.ExternalFunction;

/**An external function for finding nonzero elements of a matrix    */
public class find extends ExternalFunction
{
	/**return a column vector which points to all nonzero elements of 
       the function arguments
       (e.g. find([1,2,3;0,0,4]) returns [1,3,5,6]')
	* @param  operands[0] = matrix 
	* @return position of nonzero elements  */
	public OperandToken evaluate(Token[] operands)
	{

		// Check number of arguments
		if ((getNArgIn(operands)<1) ||
            (getNArgIn(operands)>2) )
			throwMathLibException("find: number of arguments <1 or >2");

        double[][] values = null;
        int        dy     = 0;
        int        dx     = 0;
        
        if ((operands[0] instanceof DoubleNumberToken))
        {    
    		// get data from arguments
    		values = ((DoubleNumberToken)operands[0]).getValuesRe();
        }
        else if ((operands[0] instanceof LogicalToken))
        {
            DoubleNumberToken num = ((LogicalToken)operands[0]).getDoubleNumberToken();
            values          = num.getValuesRe();
        }
        else
            throwMathLibException("find: works only on numbers and booleans");

        dy     = values.length;
        dx     = values[0].length;  

		// find number of nonzero elements
		int no = 0;
		for (int yi=0; yi<dy ; yi++)
		{
			for (int xi=0; xi<dx ; xi++)
			{
				if (values[yi][xi] != 0.0)
					no++;
			}
		}	

        // check if there is at least one element unequal zero
		// In case there is no element unequal zero return an empty DoubleNumberToken()
        if (no==0)
            return new DoubleNumberToken();

        int n = no;
        if (getNArgIn(operands)==2)
        {
            if (!(operands[1] instanceof DoubleNumberToken))
                throwMathLibException("find: second argument must be a number");

            n = (int)((DoubleNumberToken)operands[1]).getValueRe();
        }
        debugLine("find "+n);
        
        double[][] ret = null;

        if (dy>1)
        {
            // build return vector
            ret = new double[Math.min(no,n)][1];
                
            int i = 0;
    		for (int xi=0; xi<dx; xi++)
    		{
    			for (int yi=0; yi<dy; yi++)
    			{
    				if (values[yi][xi] != 0.0)
    				{
    					// nonzero element found
    					// put element position into return column vector
    					ret[i][0] = yi + xi*dy + 1;
    					i++;
    				}
                    if (i>=Math.min(no,n))
                        break;
                }
                
                if (i>=Math.min(no,n))
                    break;
    		}	

        }
        else
        {
            // dy==1
            ret = new double[1][Math.min(no,n)];
            int i = 0;
            for (int xi=0; xi<dx; xi++)
            {
                if (values[0][xi] != 0.0)
                {
                    // nonzero element found
                    // put element position into return column vector
                    ret[0][i] = xi + 1;
                    i++;
                }
                if (i>=Math.min(no,n))
                    break;
            } 
        }

        return new DoubleNumberToken(ret);        

	} // end eval
}

/*
@GROUP
matrix
@SYNTAX
find(matrix)
find(matrix, n)
@DOC
Finds all the non zero elements of a matrix
@NOTES
@EXAMPLES
<programlisting>
find([0,1,0,1])   = [2;4]
find([0,1,0,1],1) = [2]
</programlisting>
@SEE

*/

⌨️ 快捷键说明

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