Descomposición de Cholesky con matrices dinámicas: de VBA a LAMBDA+REDUCE

Juan Pablo lanza un reto al grupo: tiene una descomposición de Cholesky resuelta con VBA y quiere saber si se puede hacer con matrices dinámicas. Miki acepta el desafío y entrega una fórmula nombrada que reemplaza completamente la macro.

La solución usa LAMBDA recursiva con REDUCE, SECUENCIA, INDICE y APILARH para construir la matriz triangular inferior paso a paso. Se define como nombre ("CHOLESKY") en el administrador de nombres:

``
=LAMBDA(Rng;
LET(
n; FILAS(Rng);
REDUCE(0; SECUENCIA(n); LAMBDA(acc; j;
LET(
prev; SI(j = 1; 0; INDICE(acc;; SECUENCIA(; j - 1)));
col; SECUENCIA(n);
vals; SI(col < j; 0;
SI(col = j;
RAIZ(INDICE(Rng; j; j) - SUMAPRODUCTO(prev * prev));
(INDICE(Rng; col; j) -
MMULT(
SI(j = 1; 0; INDICE(acc; col; SECUENCIA(; j - 1)));
TRANSPONER(prev)
)
) / INDICE(acc; j; j)
)
);
APILARH(SI(j = 1; vals; acc); SI(j = 1; 0; vals))
)
))
)
)
`

Para usarla: =CHOLESKY(A1:C3) donde A1:C3 es la matriz simétrica definida positiva.

Un caso que demuestra el poder de REDUCE + LAMBDA` para implementar algoritmos matemáticos complejos que antes requerían VBA obligatoriamente.

El reto: Cholesky sin VBA

La descomposición de Cholesky factoriza una matriz simétrica definida positiva en el producto de una matriz triangular inferior por su transpuesta. Es una herramienta habitual en estadística, simulación de Montecarlo y finanzas cuantitativas. Tradicionalmente, en Excel se implementaba con una macro de VBA.

Juan Pablo lanzó el reto al grupo: tenía su Cholesky resuelto en VBA y quería saber si las matrices dinámicas modernas podían reemplazar la macro por completo. Miki aceptó el desafío y entregó una fórmula nombrada que hace exactamente eso.

La solución: LAMBDA recursiva con REDUCE

La fórmula se guarda como nombre ("CHOLESKY") en el administrador de nombres y construye la matriz triangular columna a columna:

=LAMBDA(Rng;
    LET(
        n; FILAS(Rng);
        REDUCE(0; SECUENCIA(n); LAMBDA(acc; j;
            LET(
                prev; SI(j = 1; 0; INDICE(acc;; SECUENCIA(; j - 1)));
                col; SECUENCIA(n);
                vals; SI(col < j; 0;
                    SI(col = j;
                        RAIZ(INDICE(Rng; j; j) - SUMAPRODUCTO(prev * prev));
                        (INDICE(Rng; col; j) -
                            MMULT(
                                SI(j = 1; 0; INDICE(acc; col; SECUENCIA(; j - 1)));
                                TRANSPONER(prev)
                            )
                        ) / INDICE(acc; j; j)
                    )
                );
                APILARH(SI(j = 1; vals; acc); SI(j = 1; 0; vals))
            )
        ))
    )
)

Para usarla basta con =CHOLESKY(A1:C3), donde A1:C3 es la matriz simétrica definida positiva.

Cómo funciona por dentro

  • REDUCE(0; SECUENCIA(n); ...) recorre las columnas de la matriz de la 1 a la n, acumulando en acc la matriz triangular que se va construyendo.
  • En cada columna j, la fórmula distingue tres casos según la posición de la fila col: por encima de la diagonal el valor es 0 (es triangular inferior), en la diagonal se calcula con RAIZ, y por debajo se aplica la fórmula general de Cholesky.
  • INDICE(acc;; SECUENCIA(; j - 1)) recupera las columnas ya calculadas para usarlas en el paso actual: aquí está la naturaleza recursiva del algoritmo, donde cada columna depende de las anteriores.
  • MMULT y TRANSPONER hacen los productos escalares entre las filas ya resueltas.
  • APILARH va pegando cada columna nueva al acumulado.

Funciones clave

  • REDUCE: itera sobre las columnas acumulando el resultado, el motor del algoritmo.
  • LAMBDA: encapsula toda la lógica en una función nombrada reutilizable con cualquier matriz.
  • SECUENCIA: genera los índices de filas y columnas sobre los que trabajar.
  • MMULT + TRANSPONER: los productos matriciales que exige la fórmula de Cholesky.
  • INDICE: extrae las submatrices ya calculadas para el paso recursivo.

Conclusión

Lo que antes obligaba a escribir una macro de VBA hoy cabe en una fórmula nombrada. La combinación REDUCE + LAMBDA convierte a Excel en un lenguaje capaz de implementar algoritmos matemáticos serios —factorizaciones, recursiones, álgebra lineal— sin salir de la hoja de cálculo. Retos como este, donde alguien plantea "¿esto se puede hacer con matrices dinámicas?" y otro lo resuelve, son la esencia de la comunidad de Influexcel.

Más casos con estas funciones

Más contenido de Excel en InflueXcel