NAME

PDL::FuncND - N dimensional version of functions

SYNOPSIS

    use PDL::FuncND;

DESCRIPTION

This module provides multi-dimensional implementations of common functions.

FUNCTIONS

cauchyND

Evaluate the multi-variate Cauchy function on an N-dimensional grid or at a set of locations.

  $a = cauchyND( [OPTIONAL TYPE], $nx, $ny, ..., \%options );
  $b = cauchyND( $a, \%options );
  cauchyND( inplace $a, \%options );
  $a->inplace->cauchyND( \%options );

cauchyND can evaluate the function either on a grid or at discrete locations:

  • evaluation on a grid

    Either specify the output piddle dimensions explicitly,

      $f = cauchyND( [ OPTIONAL TYPE], $nx, $ny, ..., \%options );

    or specify a template piddle without specifying the vectors option:

      $f = cauchyND( $piddle, \%options );

    By default cauchyND will evaluate the function at the indices of the points in the input piddle. These may be mapped to other values by specifying a transform with the transform option. cauchyND is inplace aware, and will use $piddle as the output piddle if its inplace flag is set.

      cauchyND( inplace $f, \%options );
      $f->inplace->cauchyND( \%options );
  • evaluation at a set of locations

    The input piddle should represent a set of vectors and should have a shape of (N,m), where m is the number of vectors in the set. The vectors option must also be set:

      $piddle = pdl( [2,1], [3,1], [4,2]  );
      $f = cauchyND( $piddle, { vectors => 1 } );

    The vectors may be transformed before use via the transform option.

The following options are available:

center | centre

The center of the distribution. If not specified it defaults to the origin.

This may take one of the following forms

  • A vector of shape (N).

    The location of the center. This may be either a Perl arrayref or a one dimensional piddle. If the input coordinates are transformed, this is in the transformed space.

  • the string auto

    If the PDF is calculated on a grid, this will center the distribution on the grid. It is an error to use this for explicit locations.

  • An arrayref

    The first element of the array is a string indicating the meaning of the rest of the array. The following are supported:

    • offset

      The second element of the array is a piddle indicating an offset from an automatically generated center. This allows easily accumulating multiple offset offsets. For example:

        $img  = cauchyND( double, 32, 32, { %attr, center => 'auto' } );
        $img += moffatND( $img, { %moffat_attr,
                                  center => [ offset => [ 5.24, 0.3 ] ] } );
transform

A PDL::Transform object to be applied to the input coordinates.

scale

The scale. If the input coordinates are transformed via the transform option, the units of scale are those in the transformed space. This may be specified as:

  • a scalar (Perl or piddle)

    This results in a symmetric distribution with the given scale along each coordinate.

  • a vector of shape (N) (piddle or Perl arrayref)

    This results in a distribution with the specified scales for each coordinate.

  • a matrix (piddle of shape (N,N))

    This should be a positive-definite matrix containing squared scales.

theta (Perl scalar)

Only for 2D! Applies a rotation (clockwise, e.g. +X rotates towards -Y) by the specified angle (specified in radians).

log (Boolean)

If true, return the logarithm of the function. Defaults to false.

gaussND

Evaluate the sampled multi-dimensional Gaussian PDF on an N-dimensional grid or at a set of locations.

  $f = gaussND( [OPTIONAL TYPE], $nx, $ny, ..., \%options );
  $f = gaussND( $piddle, \%options );
  gaussND( inplace $piddle, \%options );
  $a->inplace->gaussND( \%options );

gaussND can evaluate the function either on a grid or at discrete locations:

  • evaluation on a grid

    Either specify the output piddle dimensions explicitly,

      $f = gaussND( [ OPTIONAL TYPE], $nx, $ny, ..., \%options );

    or specify a template piddle without specifying the vectors option:

      $f = gaussND( $piddle, \%options );

    By default gaussND will evaluate the function at the indices of the points in the input piddle. These may be mapped to other values by specifying a transform with the transform option. gaussND is inplace aware, and will use $piddle as the output piddle if its inplace flag is set.

      gaussND( inplace $f, \%options );
      $f->inplace->gaussND( \%options );
  • evaluation at a set of locations

    The input piddle should represent a set of vectors and should have a shape of (N,m), where m is the number of vectors in the set. The vectors option must also be set:

      $piddle = pdl( [2,1], [3,1], [4,2]  );
      $f = gaussND( $piddle, { vectors => 1 } );

    The vectors may be transformed before use via the transform option.

The following options are available:

center | centre

The center of the distribution. If not specified it defaults to the origin.

This may take one of the following values:

  • A vector of shape (N).

    The location of the center. This may be either a Perl arrayref or a one dimensional piddle. If the input coordinates are transformed, this is in the transformed space.

  • the string auto

    If the PDF is calculated on a grid, this will center the distribution on the grid. It is an error to use this for explicit locations.

transform

A PDL::Transform object to be applied to the input coordinates.

scale

The scale. If the input coordinates are transformed via the transform option, the units of scale are those in the transformed space. This may be specified as:

  • a scalar (Perl or piddle)

    This results in a symmetric distribution with the given scale along each coordinate.

  • a vector of shape (N) (piddle or Perl arrayref)

    This results in a distribution with the specified scales for each coordinate.

  • the full covariance matrix (piddle of shape (N,N))

    This results in a distribution with correlated scales. At present this matrix is not verified to be a legitimate covariance matrix.

theta (Perl scalar)

Only for 2D! Applies a rotation (clockwise, e.g. +X rotates towards -Y) by the specified angle (specified in radians).

log (Boolean)

If true, return the logarithm of the function. Defaults to false.

lorentzND

Evaluate the multi-dimensional Lorentz function on an N-dimensional grid or at a set of locations.

  $f = lorentzND( [OPTIONAL TYPE], $nx, $ny, ..., \%options );
  $f = lorentzND( $piddle, \%options );
  lorentzND( inplace $piddle, \%options );
  $a->inplace->lorentzND( \%options );

The Lorentz function is usually defined in one dimension as.

                       2
                      g
  f(x; x0, g) = --------------
                       2    2
                (x - x0)  + g

where g is the half-width at half-max (HWHM). The two dimensional symmetric analogue (sometimes called the "radial Lorentz function") is

                                    2
                                   g
  f(x, y; x0, y0, g) = --------------------------
                               2           2    2
                       (x - x0)  + (y - y0)  + g

One can extend this to an asymmetric form by writing it as

                            1
  f(x; u, S) = ---------------------------
                      T    -1
               (x - u)  . S  . (x - u) + 1

where x is now a vector, u is the expectation value of the distribution, and S is a matrix describing the N-dimensional scale of the distribution akin to (but not the same as!) a covariance matrix.

For example, a symmetric 2D Lorentz with HWHM of g has

       [  2     ]
       [ g   0  ]
  S =  [        ]
       [      2 ]
       [ 0   g  ]

while an elliptical distribution elongated twice as much along the X axis as the Y axis would be:

       [     2      ]
       [ (2*g)   0  ]
  S =  [            ]
       [          2 ]
       [ 0       g  ]

lorentzND extends the Lorentz function to N dimensions by treating x and u as vectors of length N, and S as an NxN matrix.

Please note! While the one dimensional Lorentz function is equivalent to the one-dimensional Cauchy (aprt from, in this formulation, the normalization constant), this formulation of the multi-dimensional Lorentz function is not equivalent to the multi-dimensional Cauchy!

It can evaluate the function either on a grid or at discrete locations:

  • evaluation on a grid

    Either specify the output piddle dimensions explicitly,

      $f = lorentzND( [ OPTIONAL TYPE], $nx, $ny, ..., \%options );

    or specify a template piddle without specifying the vectors option:

      $f = lorentzND( $piddle, \%options );

    By default lorentzND will evaluate the function at the indices of the points in the input piddle. These may be mapped to other values by specifying a transform with the transform option. lorentzND is inplace aware, and will use $piddle as the output piddle if its inplace flag is set.

      lorentzND( inplace $f, \%options );
      $f->inplace->lorentzND( \%options );
  • evaluation at a set of locations

    The input piddle should represent a set of vectors and should have a shape of (N,m), where m is the number of vectors in the set. The vectors option must also be set:

      $piddle = pdl( [2,1], [3,1], [4,2]  );
      $f = lorentzND( $piddle, { vectors => 1 } );

    The vectors may be transformed before use via the transform option.

The following options are available:

center | centre

The center of the distribution. If not specified it defaults to the origin.

This may take one of the following values:

  • A vector of shape (N).

    The location of the center. This may be either a Perl arrayref or a one dimensional piddle. If the input coordinates are transformed, this is in the transformed space.

  • the string auto

    If the PDF is calculated on a grid, this will center the distribution on the grid. It is an error to use this for explicit locations.

transform

A PDL::Transform object to be applied to the input coordinates.

scale

The scale. If the input coordinates are transformed via the transform option, the units of scale are those in the transformed space. This may be specified as:

  • a scalar (Perl or piddle)

    This results in a symmetric distribution with the given scale along each coordinate.

  • a vector of shape (N) (piddle or Perl arrayref)

    This results in a distribution with the specified scales for each coordinate.

  • a matrix (piddle of shape (N,N))

    This should be a positive-definite matrix containing squared scales.

theta (Perl scalar)

Only for 2D! Applies a rotation (clockwise, e.g. +X rotates towards -Y) by the specified angle (specified in radians).

moffatND

Evaluate the multi-dimensional Moffat distribution on an N-dimensional grid or at a set of locations.

  $f = moffatND( [OPTIONAL TYPE], $nx, $ny, ..., \%options );
  $f = moffatND( $piddle, \%options );
  moffatND( inplace $piddle, \%options );
  $a->inplace->moffatND( \%options );

The Moffat distribution is usually defined in two dimensions as.

                                                           2    2
                                              2  -1       x  + y  -beta
  f(x, y, alpha, beta) := (beta - 1) (pi alpha  )    (a + -------)
                                                                2
                                                           alpha

In astronomy this is also known (confusingly) as the beta function, and is often expressed in radial form:

                                               2
                        2 r (beta - 1)        r    -beta
  fr(r, alpha, beta) := -------------- (1 + ------)
                                 2               2
                            alpha           alpha

One can extend the Cartesion expression to an n-dimensional asymmetric form by writing it as

  fn(x, u, S, alpha, beta) :=

       gamma(beta)        n/2    1/2  -1              T   -1         -beta
    ----------------- ( pi    |S|    )    (1 + (x - u) . S . (x - u))
          2 beta - n
    gamma(----------)
              2

where n is the number of dimensions, x is now a vector, u is the expectation value of the distribution, and S is a matrix describing the N-dimensional scale of the distribution akin to (but not the same as!) a covariance matrix.

Note that the integral of the distribution diverges for beta <= n/2.

moffatND extends the Moffat function to N dimensions by treating x and u as vectors of length N, and S as an NxN matrix.

It can evaluate the function either on a grid or at discrete locations:

  • evaluation on a grid

    Either specify the output piddle dimensions explicitly,

      $f = moffatND( [ OPTIONAL TYPE], $nx, $ny, ..., \%options );

    or specify a template piddle without specifying the vectors option:

      $f = moffatND( $piddle, \%options );

    By default moffatND will evaluate the function at the indices of the points in the input piddle. These may be mapped to other values by specifying a transform with the transform option. moffatND is inplace aware, and will use $piddle as the output piddle if its inplace flag is set.

      moffatND( inplace $f, \%options );
      $f->inplace->moffatND( \%options );
  • evaluation at a set of locations

    The input piddle should represent a set of vectors and should have a shape of (N,m), where m is the number of vectors in the set. The vectors option must also be set:

      $piddle = pdl( [2,1], [3,1], [4,2]  );
      $f = moffatND( $piddle, { vectors => 1 } );

    The vectors may be transformed before use via the transform option.

The following options are available:

beta

The Moffat beta parameter. Required.

center | centre

The center of the distribution. If not specified it defaults to the origin.

This may take one of the following values:

  • A vector of shape (N).

    The location of the center. This may be either a Perl arrayref or a one dimensional piddle. If the input coordinates are transformed, this is in the transformed space.

  • the string auto

    If the PDF is calculated on a grid, this will center the distribution on the grid. It is an error to use this for explicit locations.

transform

A PDL::Transform object to be applied to the input coordinates.

scale

The scale. If the input coordinates are transformed via the transform option, the units of scale are those in the transformed space. This may be specified as:

  • a scalar (Perl or piddle)

    This results in a symmetric distribution with the given scale along each coordinate.

  • a vector of shape (N) (piddle or Perl arrayref)

    This results in a distribution with the specified scales for each coordinate.

  • a matrix (piddle of shape (N,N))

    This should be a positive-definite matrix containing squared scales.

theta (Perl scalar)

Only for 2D! Applies a rotation (clockwise, e.g. +X rotates towards -Y) by the specified angle (specified in radians).

mahalanobis

Calculate the Mahalanobis distance for one or more vectors

  Signature: ( x(n,m), s(n,n), [o]d(m), \%options )
  $d = mahalanobis( $v, $S, \%options );
  mahalanobis( $v, $S, $d, \%options );

The Mahalanobis distance of a multivariate vector (v) from a location (u) with a covariance matrix (S) is defined as

  dm(x,u) = sqrt( (v-u)T S^-1 (v-u) )

The input piddle representing the vectors ($v) must have shape (N,m), where N is the dimension of the vector space and m is the number of vectors.

The input covariance matrix ($S) must have shape (N,N). It is not checked for validity.

The available options are:

center | centre

The vector from which the distance is to be calculated. It must have shape (N). It defaults to the origin.

inverted

If true, the input matrix is the inverse of the covariance matrix. Defaults to false.

squared

if true, the returned values are the distances squared.

SEE ALSO

PDL::Func.

BUGS

Please report bugs to https://rt.cpan.org/Public/Dist/Display.html?Name=PDL-FuncND.

LICENSE AND COPYRIGHT

Copyright (c) 2010-2012 The Smithsonian Astrophysical Observatory

PDL::FuncND is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.

AUTHOR

Diab Jerius <djerius@cpan.org>