.. _onemkl_blas_iamin:

iamin
=====

Finds the index of the element with the smallest absolute value in a vector

Description
***********

The ``iamin`` routines return an index ``i`` such that ``x[i]`` has
the minimum absolute value of all elements in vector ``x`` (real
variants), or such that (\|Re(``x[i]``)\| + \|Im(``x[i]``)\|) is minimal (complex variants).

``iamin`` supports the following precisions:

.. list-table::
   :header-rows: 1

   * -  T
   * -  ``float``
   * -  ``double``
   * -  ``std::complex<float>``
   * -  ``std::complex<double>``

.. note::
   The index is zero-based.

   If either ``n`` or ``incx`` are not positive, the routine returns ``0``.

   If more than one vector element is found with the same smallest
   absolute value, the index of the first one encountered is returned.

   If the vector contains ``NaN`` values, then the routine returns the
   index of the first ``NaN``.


iamin (Buffer Version)
**********************

Syntax
------

.. code-block:: cpp

   namespace oneapi::mkl::blas::column_major {
       void iamin(sycl::queue &queue,
                  std::int64_t n,
                  sycl::buffer<T,1> &x,
                  std::int64_t incx,
                  sycl::buffer<std::int64_t,1> &result)
   }

.. code-block:: cpp

   namespace oneapi::mkl::blas::row_major {
       void iamin(sycl::queue &queue,
                  std::int64_t n,
                  sycl::buffer<T,1> &x,
                  std::int64_t incx,
                  sycl::buffer<std::int64_t,1> &result)
   }

Input Parameters
----------------

queue
   The queue where the routine should be executed.

n
   Number of elements in vector ``x``.

x
   Buffer holding input vector ``x``. Size of the buffer must be at
   least (1 + (``n`` - 1)*abs(``incx``)). See :ref:`matrix-storage` for more details. 

incx
   Stride of vector ``x``.

Output Parameters
-----------------

result
   Buffer where the zero-based index ``i`` of the minimum element
   is stored.


iamin (USM Version)
*******************

Syntax
------

.. code-block:: cpp

   namespace oneapi::mkl::blas::column_major {
       sycl::event iamin(sycl::queue &queue,
                         std::int64_t n,
                         const T *x,
                         std::int64_t incx,
                         T_res *result,
                         const std::vector<sycl::event> &dependencies = {})
   }

.. code-block:: cpp

   namespace oneapi::mkl::blas::row_major {
       sycl::event iamin(sycl::queue &queue,
                         std::int64_t n,
                         const T *x,
                         std::int64_t incx,
                         T_res *result,
                         const std::vector<sycl::event> &dependencies = {})
   }

Input Parameters
----------------

queue
   The queue where the routine should be executed.

n
   Number of elements in vector ``x``.

x
   The pointer to input vector ``x``. Size of the array holding input vector
   ``x`` must be at least (1 + (``n`` - 1)*abs(``incx``)). See :ref:`matrix-storage` for more details.

incx
   Stride of vector ``x``.

Output Parameters
-----------------

result
   Pointer to where the zero-based index ``i`` of the minimum element
   is stored.

Return Values
-------------

Output event to wait on to ensure computation is complete.