Utilisation d'une matrice comme paramètre dans un algorithme

Oct 20 2020

J'essaie d'écrire un algorithme de pseudocode dans LaTeX, où l'une des fonctions doit avoir des matrices comme paramètre. J'ai besoin de lui faire ressembler à ceci:

J'ai utilisé le package algorithm, mais il ne se compilera pas si j'essaie d'utiliser la matrice dans le champ des paramètres.

\begin{algorithm}
    \floatname{algorithm}{Algoritmo \arabic{chapter}.}
    \label{coordenatesGenerator}
    \caption{Generador de una variable aleatoria normal estándar}
    \begin{algorithmic}[1]
            \Function{GeneradorNormalBivariada}{$\mu \in \Re^{2}, \Sigma \in \Re^{2} \times \Re^{2}; \{ u_{k}\}^{4}_{k-1} \in (0,1)^{4}$} 
            \State $\Sigma \gets CC^{t}$ \Comment{Descomposición de Cholesky}
            \State $z_{1} \gets GeneradorNormalEstandar(u_{1},u_{2});$
            \State $z_{2} \gets GeneradorNormalEstandar(u_{3},u_{4});$
            \State $x_{1} \gets \mu_{1} + c_{1,1}z_{1};$
            \State $x_{2} \gets \mu_{2} + c_{1,1}z_{1} + c_{2,1}z_{1} + c_{2,2}z_{2};$
            \State \textbf{return} $\left( \begin{bmatrix} x_{1} \\ x_{2} \end{bmatrix} \right);$
        \EndFunction
    \end{algorithmic}
\end{algorithm}

Je dois remplacer les valeurs \muet \Sigmadans la ligne spécifiée pour les matrices.

\Function{GeneradorNormalBivariada}{$\mu \in \Re^{2}, \Sigma \in \Re^{2} \times \Re^{2}; \{ u_{k}\}^{4}_{k-1} \in (0,1)^{4}$} 

J'apprécie toute aide que vous pouvez me donner sur ce problème. Merci.

Réponses

2 Werner Oct 20 2020 at 03:42

Puisque l'argument de votre appel de fonction est testé par un \ifthenelseconditionnel, il est préférable de stocker la construction des matrices dans des boîtes déjà définies. Ci-dessous, j'ai créé \mumatrixet \sigmamatrixqui est utilisé via \useboxle deuxième argument de la fonction.

\documentclass{article}

\usepackage{algorithm,algpseudocode}
\usepackage{amsmath}

% https://tex.stackexchange.com/a/145738/5764
\algdef{SE}[FUNCTION]{Function}{EndFunction}%
   [2]{\algorithmicfunction\ \textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}}%
   {\algorithmicend\ \algorithmicfunction}%
\newcommand{\functioncall}{\textproc}

\begin{document}

\begin{algorithm}
  \caption{An algorithm}
  \newsavebox\mumatrix
  \savebox{\mumatrix}{$\begin{bmatrix} \mu_1 \\ \mu_2 \end{bmatrix}$}%
  \newsavebox\sigmamatrix
  \savebox{\sigmamatrix}{$\begin{bmatrix} \sigma_1^2 & \sigma_{1,2} \\ \sigma_{2,1} & \sigma_2^2 \end{bmatrix}$}%
  \begin{algorithmic}[1]
    \Function{FunctionA}{$ \usebox{\mumatrix} \in \Re^2, \usebox{\sigmamatrix} \in \Re^2 \times \Re^2, \{ u_k \}^4_{k - 1} \in (0,1)^4$}
      \State $\Sigma \gets CC^t$ \Comment{A comment}
      \State $z_1 \gets \functioncall{FunctionB}(u_1, u_2);$
      \State $z_2 \gets \functioncall{FunctionB}(u_3, u_4);$
      \State $x_1 \gets \mu_1 + c_{1,1} z_1;$
      \State $x_2 \gets \mu_2 + c_{1,1} z_1 + c_{2,1} z_1 + c_{2,2} z_2;$
      \State \Return $\left( \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} \right);$
    \EndFunction
  \end{algorithmic}
\end{algorithm}

\end{document}
DG' Oct 20 2020 at 03:52

Vous pouvez utiliser smallmatrixpour définir une matrice en ligne:

\documentclass{article}
\usepackage{algorithm,algpseudocode}
\usepackage{mathtools}

\begin{document}

\begin{algorithm}
    \begin{algorithmic}[1]
        \Function{GeneradorNormalBivariada}{$\mu \in \Re^{2}, \Sigma \in \Re^{2} \times \Re^{2}; \{ u_{k}\}^{4}_{k-1} \in (0,1)^{4}$}
        \State $\Sigma \gets CC^{t}$ \Comment{Descomposición de Cholesky}
        \State $z_{1} \gets GeneradorNormalEstandar(u_{1},u_{2});$
        \State $z_{2} \gets GeneradorNormalEstandar(u_{3},u_{4});$
        \State $x_{1} \gets \mu_{1} + c_{1,1}z_{1};$
        \State $x_{2} \gets \mu_{2} + c_{1,1}z_{1} + c_{2,1}z_{1} + c_{2,2}z_{2};$
        \State \textbf{return} $\left(\bigl[\begin{smallmatrix} x_{1} \\ x_{2} \end{smallmatrix}\bigr]\right);$
        \EndFunction
    \end{algorithmic}
\end{algorithm}
\end{document}