%
% Standard operations from linear algebra.
%

% Needed for \lvert, \rVert, etc. and \operatorname.
\usepackage{amsmath}

\input{mjo-common}

% Absolute value (modulis) of a scalar.
\newcommand*{\abs}[1]{ \left\lvert {#1} \right\rvert }

% Norm of a vector.
\newcommand*{\norm}[1]{ \left\lVert {#1} \right\rVert }

% The inner product between its two arguments.
\newcommand*{\ip}[2]{ \langle {#1}, {#2} \rangle }

% The tensor product of its two arguments.
\newcommand*{\tp}[2]{ {#1} \otimes {#2} }

% The ``span of'' operator. The name \span is already taken.
\newcommand*{\spanof}[1]{ \operatorname{span} \of{{#1}} }

% The ``co-dimension of'' operator.
\newcommand*{\codim}{ \operatorname{codim} }

% The trace of an operator.
\newcommand*{\trace}[1]{ \operatorname{trace} \of{{#1}} }

% The orthogonal projection of its second argument onto the first.
\newcommand*{\proj}[2] { \operatorname{proj}\of{#1, #2} }

% The ``Automorphism group of'' operator.
\newcommand*{\Aut}[1]{ \operatorname{Aut} \of{{#1}} }

% The ``Lie algebra of'' operator.
\newcommand*{\Lie}[1]{ \operatorname{Lie} \of{{#1}} }

% The ``write a matrix as a big vector'' operator.
\newcommand*{\vectorize}[1]{ \operatorname{vec} \of{{#1}} }

% The ``write a big vector as a matrix'' operator.
\newcommand*{\matricize}[1]{ \operatorname{mat} \of{{#1}} }

% An inline column vector, with parentheses and a transpose operator.
\newcommand*{\colvec}[1]{ \left( {#1} \right)^{T} }

% Bounded linear operators on some space. The required argument is the
% domain of those operators, and the optional argument is the
% codomain. If the optional argument is omitted, the required argument
% is used for both.
\newcommand*{\boundedops}[2][]{
  \mathcal{B}\of{ {#2}
    \if\relax\detokenize{#1}\relax
      {}%
    \else
      {,{#1}}%
    \fi
  }
}
