Usando uma matriz como parâmetro em um algoritmo

Oct 20 2020

Estou tentando escrever um algoritmo de pseudocódigo em LaTeX, onde uma das funções precisa ter matrizes como parâmetro. Eu preciso fazer com que fique assim:

Estou usando o pacote de algoritmos, mas ele não compila se tento usar a matriz no 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}

Preciso substituir os valores \mue \Sigmana linha especificada para as matrizes.

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

Agradeço qualquer ajuda que você possa me dar sobre esse problema. Obrigado.

Respostas

2 Werner Oct 20 2020 at 03:42

Como o argumento de sua chamada de função é testado por uma \ifthenelsecondicional, é melhor armazenar a construção das matrizes dentro de caixas já definidas. Abaixo eu criei \mumatrixe \sigmamatrixque é usado via \useboxdentro do segundo argumento da função.

\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

Você pode usar smallmatrixpara definir uma matriz embutida:

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