matrix_norm.h

Back to Matrix norms

pastel/math/matrix/

// Description: Matrix norm

#ifndef PASTELMATH_MATRIX_NORM_H
#define PASTELMATH_MATRIX_NORM_H

#include "pastel/math/matrix/matrix.h"
#include "pastel/math/matrix/matrix_norm.h"
#include "pastel/math/norm/norm_concept.h"
#include "pastel/math/norm/euclidean_norm.h"

#include <numeric>

namespace Pastel
{

    //! Returns a pointwise matrix norm given by a norm.
    /*!
   This function considers the matrix as a long vector, 
   and computes a vector norm for it. 
   */
    template <
        typename T,
        Norm_Concept Norm = Euclidean_Norm<typename MatrixExpr<T>::Scalar>
    >
    typename MatrixExpr<T>::Scalar norm2(
        const MatrixExpr<T>& matrix,
        const Norm& norm = Norm())
    {
        integer k = 0;
        auto result = norm();
        for (integer i = 0;i < matrix.rows();++i)
        {
            for (integer j = 0;j < matrix.cols();++j)
            {
                result.set(k, matrix(i, j));
                ++k;
            }
        }
        return ~result;
    }

    //! Returns the induced manhattan matrix norm.
    /*!
   returns:
   max(sum(abs(matrix)))
   */
    template <typename T>
    typename MatrixExpr<T>::Scalar manhattanNorm(const MatrixExpr<T>& matrix)
    {
        return sum(abs(matrix)).maxCoeff();
    }

    //! Returns the squared Frobenius matrix norm.
    /*!
   returns:
   norm2(matrix)
   */
    template <typename T>
    typename MatrixExpr<T>::Scalar frobeniusNorm2(const MatrixExpr<T>& matrix)
    {
        return norm2(matrix);
    }

    //! Returns the induced maximum matrix norm.
    /*!
   returns:
   max(sum(abs(transpose(matrix))))
   */
    template <typename T>
    typename MatrixExpr<T>::Scalar maxNorm(const MatrixExpr<T>& matrix)
    {
        return sum(abs(transpose(matrix))).maxCoeff();
    }
}

#endif