All Downloads are FREE. Search and download functionalities are using the official Maven repository.

math.lapack.Idamax Maven / Gradle / Ivy

Go to download

Elementary math utilities with a focus on random number generation, non-linear optimization, interpolation and solvers

The newest version!
/*
 * Copyright ? ???? The University of Tennessee. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 * ? Redistributions of source code must retain the above copyright notice, this
 *   list of conditions and the following disclaimer.
 * ? Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer listed in this license in
 *   the documentation and/or other materials provided with the distribution.
 * ? Neither the name of the copyright holders nor the names of its contributors
 *   may be used to endorse or promote products derived from this software without
 *   specific prior written permission.
 *
 * This software is provided by the copyright holders and contributors "as is" and
 * any express or implied warranties, including, but not limited to, the implied
 * warranties of merchantability and fitness for a particular purpose are disclaimed.
 * In no event shall the copyright owner or contributors be liable for any direct,
 * indirect, incidental, special, exemplary, or consequential damages (including,
 * but not limited to, procurement of substitute goods or services; loss of use,
 * data, or profits; or business interruption) however caused and on any theory of
 * liability, whether in contract, strict liability, or tort (including negligence
 * or otherwise) arising in any way out of the use of this software, even if advised
 * of the possibility of such damage. 
 */
package math.lapack;

// IDAMAX finds the index of the first element having maximum absolute value.
final class Idamax {

    static int idamax(int n, double[] dx, int _dx_offset, int incx) {

        if (n < 1 || incx <= 0) {
            return 0;
        }
        if (n == 1) {
            return 1;
        }

        int l = 0;
        int idamax = 1;
        double dmax = 0.0;

        // code for increment not equal to 1
        if (incx != 1) {
            int ix = 1;
            dmax = Math.abs(dx[_dx_offset]);
            ix += incx;
            l = 2;
            for (int k = n - 1; k > 0; k--) {
                if (Math.abs(dx[ix - 1 + _dx_offset]) > dmax) {
                    idamax = l;
                    dmax = Math.abs(dx[ix - 1 + _dx_offset]);
                }
                ix += incx;
                l++;
            }

            return idamax;
        }
        // code for increment equal to 1
        dmax = Math.abs(dx[_dx_offset]);
        l = 2;
        for (int k = n - 1; k > 0; k--) {
            if (Math.abs(dx[l - 1 + _dx_offset]) > dmax) {
                idamax = l;
                dmax = Math.abs(dx[l - 1 + _dx_offset]);
            }
            l++;
        }

        return idamax;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy