module #include "diplib/math.h"
Tensor operators Operators specific to tensor images.
Contents
- Reference
Functions
-
auto dip::
Transpose(dip::Image const& in) -> dip::Image - Transposes the tensor image, the data are not copied.
-
void dip::
ConjugateTranspose(dip::Image const& in, dip::Image& out) - Computes the conjugate transpose of the tensor image
in
. -
void dip::
DotProduct(dip::Image const& lhs, dip::Image const& rhs, dip::Image& out) - Computes the dot product (inner product) of two vector images.
-
void dip::
CrossProduct(dip::Image const& lhs, dip::Image const& rhs, dip::Image& out) - Computes the cross product (inner product) of two vector images.
-
void dip::
Norm(dip::Image const& in, dip::Image& out) - Computes the norm of the vector at each pixel in image
in
. -
void dip::
SquareNorm(dip::Image const& in, dip::Image& out) - Computes the square of the norm of the vector at each pixel in image
in
. -
void dip::
Angle(dip::Image const& in, dip::Image& out) - Computes the angle of the vector at each pixel in image
in
. -
void dip::
Orientation(dip::Image const& in, dip::Image& out) - Computes the orientation of the vector at each pixel in image
in
. -
void dip::
CartesianToPolar(dip::Image const& in, dip::Image& out) - Converts the vector at each pixel in image
in
from Cartesian coordinates to polar (or spherical) coordinates. -
void dip::
PolarToCartesian(dip::Image const& in, dip::Image& out) - Converts the vector at each pixel in image
in
from polar (or spherical) coordinates to Cartesian coordinates. -
void dip::
Determinant(dip::Image const& in, dip::Image& out) - Computes the determinant of the square matrix at each pixel in image
in
. -
void dip::
Trace(dip::Image const& in, dip::Image& out) - Computes the trace of the square matrix at each pixel in image
in
. -
void dip::
Rank(dip::Image const& in, dip::Image& out) - Computes the rank of the square matrix at each pixel in image
in
. The output is DT_UINT8, under the assumption that we won’t have tensor images with a rank higher than 255. -
void dip::
Eigenvalues(dip::Image const& in, dip::Image& out) - Computes the eigenvalues of the square matrix at each pixel in image
in
. -
void dip::
LargestEigenvalue(dip::Image const& in, dip::Image& out) - Finds the largest eigenvalue of the square matrix at each pixel in image
in
. -
void dip::
SmallestEigenvalue(dip::Image const& in, dip::Image& out) - Finds the smallest eigenvalue of the square matrix at each pixel in image
in
. -
void dip::
EigenDecomposition(dip::Image const& in, dip::Image& out, dip::Image& eigenvectors) - Computes the eigenvalues and eigenvectors of the square matrix at each pixel in image
in
. -
void dip::
LargestEigenvector(dip::Image const& in, dip::Image& out) - Finds the largest eigenvector of the symmetric matrix at each pixel in image
in
. -
void dip::
SmallestEigenvector(dip::Image const& in, dip::Image& out) - Finds the smallest eigenvector of the symmetric matrix at each pixel in image
in
. -
void dip::
Inverse(dip::Image const& in, dip::Image& out) - Computes the inverse of the square matrix at each pixel in image
in
. -
void dip::
PseudoInverse(dip::Image const& in, dip::Image& out, dip::dfloat tolerance = 1e-7) - Computes the pseudo-inverse of the matrix at each pixel in image
in
. -
void dip::
SingularValues(dip::Image const& in, dip::Image& out) - Computes the “thin” singular value decomposition of the matrix at each pixel in image
in
. -
void dip::
SingularValueDecomposition(dip::Image const& A, dip::Image& U, dip::Image& S, dip::Image& V) - Computes the “thin” singular value decomposition of the matrix at each pixel in image
in
. -
void dip::
Identity(dip::Image const& in, dip::Image& out) - Creates an image whose pixels are identity matrices.
-
void dip::
SumTensorElements(dip::Image const& in, dip::Image& out) - Adds all tensor elements, producing a scalar image.
-
void dip::
ProductTensorElements(dip::Image const& in, dip::Image& out) - Multiplies all tensor elements, producing a scalar image.
-
void dip::
AllTensorElements(dip::Image const& in, dip::Image& out) - Determines if all tensor elements are non-zero, producing a binary scalar image.
-
void dip::
AnyTensorElement(dip::Image const& in, dip::Image& out) - Determines if any tensor element is non-zero, producing a binary scalar image.
-
void dip::
MaximumTensorElement(dip::Image const& in, dip::Image& out) - Takes the maximum tensor element at each pixel, producing a scalar image.
-
void dip::
MaximumAbsTensorElement(dip::Image const& in, dip::Image& out) - Takes the maximum absolute tensor element at each pixel, producing a scalar image. For float and complex images only.
-
void dip::
MinimumTensorElement(dip::Image const& in, dip::Image& out) - Takes the minimum tensor element at each pixel, producing a scalar image.
-
void dip::
MinimumAbsTensorElement(dip::Image const& in, dip::Image& out) - Takes the minimum absolute tensor element at each pixel, producing a scalar image. For float and complex images only.
-
void dip::
MeanTensorElement(dip::Image const& in, dip::Image& out) - Computes the mean tensor element value at each pixel, producing a scalar image.
-
void dip::
GeometricMeanTensorElement(dip::Image const& in, dip::Image& out) - Computes the geometric mean tensor element value at each pixel, producing a scalar image.
-
void dip::
SortTensorElements(dip::Image& out) - Sorts the tensor elements within each pixel from largest to smallest. Works in-place.
out
must be real-valued. -
void dip::
SortTensorElementsByMagnitude(dip::Image& out) - Sorts the tensor elements within each pixel by magnitude from largest to smallest. Works in-place.
out
must be of a floating point or complex type.
Function documentation
void
dip:: CrossProduct(dip::Image const& lhs,
dip::Image const& rhs,
dip::Image& out)
Computes the cross product (inner product) of two vector images.
Input image tensors must be 2-vectors or 3-vectors. For 3-vectors, the cross product is as commonly defined in 3D. For 2-vectors, we define the cross product as the z-component of the cross product of the 3D vectors obtained by adding a 0 z-component to the inputs. That is, it is the area of the parallelogram formed by the two 2D vectors.
void
dip:: Angle(dip::Image const& in,
dip::Image& out)
Computes the angle of the vector at each pixel in image in
.
in
must be a 2-vector or a 3-vector. For a 2-vector, out
is a scalar image representing
phi, the angle from the x-axis. For a 3-vector, out
has 2 tensor components, corresponding
to phi and theta. phi, as in the 2D case, is the angle from the x-axis within the x-y plane
(azimuth). theta is the angle from the z-axis (inclination). See dip::CartesianToPolar
for
more details. This function yields the same output as dip::CartesianToPolar
, but without
the first tensor component.
void
dip:: Orientation(dip::Image const& in,
dip::Image& out)
Computes the orientation of the vector at each pixel in image in
.
Orientation is defined as the angle mapped to the half-circle or half-sphere with positive x-coordinate.
That is, in 2D it is an angle in the range (-π/2, π/2), and in 3D the phi component is mapped to
that same range. See dip::Angle
for more information.
void
dip:: CartesianToPolar(dip::Image const& in,
dip::Image& out)
Converts the vector at each pixel in image in
from Cartesian coordinates to polar
(or spherical) coordinates.
in
must be a 2-vector or a 3-vector. out
is a same-size vector containing r and phi
in the 2D case, and r, phi and theta in the 3D case. phi is the angle to the x-axis
within the x-y plane (azimuth). theta is the angle from the z-axis (inclination).
That is, in 2D:
in[ 0 ] == out[ 0 ] * Cos( out[ 1 ] ); in[ 1 ] == out[ 0 ] * Sin( out[ 1 ] );
and in 3D:
in[ 0 ] == out[ 0 ] * Cos( out[ 1 ] ) * Sin( out[ 2 ] ); in[ 1 ] == out[ 0 ] * Sin( out[ 1 ] ) * Sin( out[ 2 ] ); in[ 2 ] == out[ 0 ] * Cos( out[ 2 ] );
void
dip:: PolarToCartesian(dip::Image const& in,
dip::Image& out)
Converts the vector at each pixel in image in
from polar (or spherical) coordinates to
Cartesian coordinates.
in
must be a 2-vector or a 3-vector. See dip::CartesianToPolar
for a description of the polar
coordinates used.
void
dip:: Eigenvalues(dip::Image const& in,
dip::Image& out)
Computes the eigenvalues of the square matrix at each pixel in image in
.
out
is a vector image containing the eigenvalues. If in
is symmetric and
real-valued, then out
is real-valued, otherwise, out
is complex-valued.
The eigenvalues are sorted by magnitude, in descending order.
void
dip:: LargestEigenvalue(dip::Image const& in,
dip::Image& out)
Finds the largest eigenvalue of the square matrix at each pixel in image in
.
Computes the eigenvalues in the same way as dip::Eigenvalues
, but
outputs only the eigenvector with the largest magnitude.
void
dip:: SmallestEigenvalue(dip::Image const& in,
dip::Image& out)
Finds the smallest eigenvalue of the square matrix at each pixel in image in
.
Computes the eigenvalues in the same way as dip::Eigenvalues
, but
outputs only the eigenvector with the smallest magnitude.
void
dip:: EigenDecomposition(dip::Image const& in,
dip::Image& out,
dip::Image& eigenvectors)
Computes the eigenvalues and eigenvectors of the square matrix at each pixel in image in
.
The decomposition is such that in * eigenvectors == eigenvectors * out
.
eigenvectors
is almost always invertible, in which case one can write
in == eigenvectors * out * Inverse( eigenvectors )
.
out
is a diagonal matrix image containing the eigenvalues. If in
is symmetric and
real-valued, then out
is real-valued, otherwise, out
is complex-valued.
The eigenvalues are sorted by magnitude, in descending order.
The eigenvectors are the columns eigenvectors
. It has the same data type as out
.
void
dip:: LargestEigenvector(dip::Image const& in,
dip::Image& out)
Finds the largest eigenvector of the symmetric matrix at each pixel in image in
.
Computes the eigen decomposition in the same way as dip::EigenDecomposition
, but
outputs only the eigenvector that corresponds to the eigenvalue with largest magnitude.
in
must be symmetric and real-valued.
void
dip:: SmallestEigenvector(dip::Image const& in,
dip::Image& out)
Finds the smallest eigenvector of the symmetric matrix at each pixel in image in
.
Computes the eigen decomposition in the same way as dip::EigenDecomposition
, but
outputs only the eigenvector that corresponds to the eigenvalue with smallest magnitude.
in
must be symmetric and real-valued.
void
dip:: Inverse(dip::Image const& in,
dip::Image& out)
Computes the inverse of the square matrix at each pixel in image in
.
The result is undetermined if the matrix is not invertible.
void
dip:: PseudoInverse(dip::Image const& in,
dip::Image& out,
dip::dfloat tolerance = 1e-7)
Computes the pseudo-inverse of the matrix at each pixel in image in
.
Computes the Moore-Penrose pseudo-inverse using tolerance
. Singular values smaller than
tolerance * max(rows,cols) * p
, with p
the largest singular value, will be set to zero in the inverse.
void
dip:: SingularValues(dip::Image const& in,
dip::Image& out)
Computes the “thin” singular value decomposition of the matrix at each pixel in image in
.
For an input image in
with a tensor size of NxP, and with M the smaller of N and P, out
is a
vector image with M elements, corresponding to the singular values, sorted in decreasing order.
Use dip::SingularValueDecomposition
if you need the full decomposition.
This function uses the two-sided Jacobi SVD decomposition algorithm. This is efficient for small matrices only.
void
dip:: SingularValueDecomposition(dip::Image const& A,
dip::Image& U,
dip::Image& S,
dip::Image& V)
Computes the “thin” singular value decomposition of the matrix at each pixel in image in
.
For an input image A
with a tensor size of NxP, and with M the smaller of N and P, S
is a
square diagonal MxM matrix, U
is a NxM matrix, and V is a PxM matrix. These matrices satisfy
the relation .
The (diagonal) elements of S
are the singular values, sorted in decreasing order.
You can use dip::SingularValues
if you are not interested in computing U
and V
.
This function uses the two-sided Jacobi SVD decomposition algorithm. This is efficient for small matrices only.
void
dip:: Identity(dip::Image const& in,
dip::Image& out)
Creates an image whose pixels are identity matrices.
out
will have the same sizes as in
, and with a tensor representation of a diagonal matrix
with a size concordant to that of the tensor representation of in
. For example, for an N-vector
image, the resulting output matrix image will be NxN. out
will be of type dip::DT_SFLOAT
.