Usando uma matriz como parâmetro em um algoritmo
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
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}
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}