Sounds (marginally) useful; although elementary row/column operations are
in practice usually better implemented directly by indexing rather than in
an operator form. Though I can see a use for the latter.

My suggestion: its not a common enough operation to deserve a 4 letter
acronym (assuming those are good things in any context). A full
'elementary' would be much preferable I think.


On Mon, Mar 24, 2014 at 4:06 AM, Matt Pagan <[email protected]> wrote:

> Greetings!
> I made a patch for NumPy that adds a function for easily creating
> elementary matrices. Sorry for not knowing the process for submitting
> patches.
>
> Is this function something the NumPy community could see adding to the
> codebase? Are there ways I can improve on this?
>
> diff --git a/numpy/lib/twodim_base.py b/numpy/lib/twodim_base.py
> index 12c0f9b..10073af 100644
> --- a/numpy/lib/twodim_base.py
> +++ b/numpy/lib/twodim_base.py
> @@ -967,3 +967,85 @@ def triu_indices_from(arr, k=0):
>      if not (arr.ndim == 2 and arr.shape[0] == arr.shape[1]):
>          raise ValueError("input array must be 2-d and square")
>      return triu_indices(arr.shape[0], k)
> +
> +def elem(N, i, j=None, t=None, dtype=float):
> +    """
> +    Return an elementary matrix.
> +
> +    Parameters
> +    ----------
> +    N : int
> +        The size of the NxN array to be returned. Elementary matrices
> +        should be square.
> +    i : int
> +        The index of the first row on which operations are to be
> +        performed.
> +    j : int
> +        If set, the index of the second row of which operations are to
> +        be performed.
> +    t : scalar
> +        If set, the factor by which a given row will be multiplied.
> +
> +    Returns
> +    -------
> +    m: ndarray of shape (NxN)
> +       The identity matrix after a single row operation has been
> +       performed on it.
> +
> +    See also
> +    --------
> +    eye, identity
> +
> +    Examples
> +    -------
> +    To swap the the first and third rows of a 4x4 identity matirx:
> +
> +    >>> L = elem(4, 0, 2)
> +    >>> L
> +    array([[ 0.,  0.,  1.,  0.],
> +           [ 0.,  1.,  0.,  0.],
> +           [ 1.,  0.,  0.,  0.],
> +           [ 0.,  0.,  0.,  1.]])
> +
> +    This array then becomes quite useful for matrix multiplication.
> +
> +    >>> H = np.matrix([[ 2,  3,  5,  7],
> +           [11, 13, 17, 19],
> +           [23, 29, 31, 37],
> +           [41, 43, 47, 53]])
> +    >>> L*H
> +    matrix([[ 23.,  29.,  31.,  37.],
> +            [ 11.,  13.,  17.,  19.],
> +            [  2.,   3.,   5.,   7.],
> +            [ 41.,  43.,  47.,  53.]])
> +
> +    When the elemntary matrix is multiplied by the given matrix, the
> +    result is the given matrix with it's first and third rows swapped.
> +
> +    If the given matrix is multiplied by the elementary matrix (i.e.,
> +    the multiplication takes place in reverse order, the result is
> +   the given matrix with its first and third columns swapped.
> +
> +    >>> H*L
> +    matrix([[  5.,   3.,   2.,   7.],
> +            [ 17.,  13.,  11.,  19.],
> +            [ 31.,  29.,  23.,  37.],
> +            [ 47.,  43.,  41.,  53.]])
> +
> +    """
> +    m=eye(N, dtype=dtype)
> +    if j==None and t==None:
> +        raise ValueError("One or more of %s and %s must be set." % \
> +            ('j', 't'))
> +        return None
> +    elif t==None:
> +        swap = np.array(m[i])
> +        m[i] = m[j]
> +        m[j] = swap
> +        return m
> +    elif j==None:
> +        m[i] *= t
> +        return m
> +    else:
> +        m[j] += (t * m[i])
> +        return m
>
> --
> Matt Pagan
> [email protected]
> PGP: 0xE9284418E360583C
>
>
> _______________________________________________
> NumPy-Discussion mailing list
> [email protected]
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
>
_______________________________________________
NumPy-Discussion mailing list
[email protected]
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to