Usando una matriz como parámetro en un algoritmo

Oct 20 2020

Estoy tratando de escribir un algoritmo de pseudocódigo en LaTeX, donde una de las funciones necesita tener matrices como parámetro. Necesito que se vea así:

He estado usando el paquete de algoritmos, pero no se compilará si intento usar la matriz en el campo de parámetros.

\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}

Necesito reemplazar los valores \muy \Sigmaen la línea especificada para las matrices.

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

Agradezco cualquier ayuda que pueda brindarme sobre este tema. Gracias.

Respuestas

2 Werner Oct 20 2020 at 03:42

Dado que el argumento de la llamada a la función es probado por un \ifthenelsecondicional, es mejor almacenar la construcción de las matrices dentro de cajas ya establecidas. A continuación, creé \mumatrixy \sigmamatrixeso se usa \useboxdentro del segundo argumento de la función.

\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

Puede usar smallmatrixpara establecer una matriz en línea:

\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}