
¿Cuál es la forma más sencilla de hacer diagramas que representen dimensiones matriciales como los siguientes?
Puedo hacerlo con subíndices simples, pero me gusta el efecto visual que dan estos diagramas.
Respuesta1
Aquí lo hago con pilas, colocando los índices debajo de las casillas. La macro principal es
\matbox{rows}{columns}{row index}{column index}{matrix name}
.
Una macro auxiliar es \raiserows
, que es como \raisebox
, excepto que la "longitud" se especifica en filas, no en la longitud real. Tenga en cuenta que en el MWE, debido a que X
tiene 7 filas, mientras que P^T
solo tiene 2 filas, P^T
se debe levantar (7-2)/2 = 2,5 filas.
Introduzco el factor \matscale
para escalar los tamaños de tus cajas. De forma predeterminada, cada fila y columna del tamaño del cuadro ocupará un cuadrado de tamaño \baselineskip
en un lado. El factor \matscale
(que por defecto es 1) escalará ese valor.
EDITADO para establecer índices de matriz en\scriptstyle
\documentclass{article}
\usepackage{stackengine}
\stackMath
\newlength\matfield
\newlength\tmplength
\def\matscale{1.}
\newcommand\dimbox[3]{%
\setlength\matfield{\matscale\baselineskip}%
\setbox0=\hbox{\vphantom{X}\smash{#3}}%
\setlength{\tmplength}{#1\matfield-\ht0-\dp0}%
\fboxrule=1pt\fboxsep=-\fboxrule\relax%
\fbox{\makebox[#2\matfield]{\addstackgap[.5\tmplength]{\box0}}}%
}
\newcommand\raiserows[2]{%
\setlength\matfield{\matscale\baselineskip}%
\raisebox{#1\matfield}{#2}%
}
\newcommand\matbox[5]{
\stackunder{\dimbox{#1}{#2}{$\mathbf{#5}$}}{\scriptstyle(#3\times #4)}%
}
\parskip 1em
\begin{document}
$\renewcommand\matscale{.6}
\matbox{7}{4}{I}{J}{X} =
\matbox{7}{2}{I}{R}{T} \raiserows{2.5}{\matbox{2}{4}{R}{J}{P^T}} +
\matbox{7}{4}{I}{J}{E}$
\end{document}
Sólo para aclarar, por si no quedó claro. Se pueden utilizar dimensiones matriciales reales (muy grandes), siempre que se escale adecuadamente. Por ejemplo, lo siguiente funciona::
$\renewcommand\matscale{.05}
\matbox{300}{75}{I}{J}{X} =
\matbox{300}{25}{I}{R}{T} \raiserows{137.5}{\matbox{25}{75}{R}{J}{P^T}} +
\matbox{300}{75}{I}{J}{E}$
Respuesta2
Aquí hay una manera de hacerlo "manualmente".
\documentclass{article}
\usepackage{amsbsy}
\newcommand*{\clap}[1]{\hbox to 0pt{\hss#1\hss}}
\newcommand*{\mat}[1]{\boldsymbol{\mathrm{#1}}}
\newcommand*{\subdims}[3]{\clap{\raisebox{#1}[0pt][0pt]{$\scriptstyle(#2 \times #3)$}}}
\fboxrule=1pt
\begin{document}
\Huge
\[
\framebox[2.5cm]{\clap{\raisebox{0pt}[1.5cm][1.5cm]{$\mat X$}}\subdims{-2.5cm} I J} =
\framebox[1.5cm]{\clap{\raisebox{0pt}[1.5cm][1.5cm]{$\mat T$}}\subdims{-2.5cm} I R} \
\framebox[2.5cm]{\clap{\raisebox{5mm}[1.5cm]{$\mat P^T$}} \subdims{-1cm} R J} +
\framebox[2.5cm]{\clap{\raisebox{0pt}[1.5cm][1.5cm]{$\mat E$}}\subdims{-2.5cm} I J}
\]
\end{document}
Resultado:
¡Obviamente esto no se compara con la poderosa y general respuesta del Sr. Segletes! Sin embargo, utiliza comandos más básicos, lo que podría tener la ventaja de que es más rápido de compilar en una máquina lenta y funcionará incluso con una instalación más pequeña que carece de paquetes. O tal vez simplemente te guste ensuciarte las manos. El inconveniente, por supuesto, es que usted mismo tendrá que determinar todas las anchuras, alturas y profundidades.
Nota: si utiliza mathtools
cualquier otro paquete que proporcione un \clap
comando, entrará en conflicto con la definición. En este caso, simplemente omita esta definición y utilice la \clap
proporcionada.
Respuesta3
Esta es una posible solución a través amsmath
del paquete.
Código
\documentclass[12pt]{article}
\usepackage[margin=1cm,paper size={20cm,5cm}]{geometry}
\usepackage{amsmath,amssymb}
\thispagestyle{empty}
\begin{document}
\[
{\begin{pmatrix}
& & \\
& X &\\
& &
\end{pmatrix}
\mkern-10mu}_{I \times J}=
{\begin{pmatrix}
\phantom{T}\\
\makebox[20pt][c]{$T$}\\
\phantom{T}
\end{pmatrix}
\mkern-10mu}_{I \times R}
{\begin{pmatrix}
& & \\
& \raisebox{10pt}{$P^T$} &\\
\end{pmatrix}\mkern-10mu}_{R \times J}+
{\begin{pmatrix}
& & \\
& E &\\
& &
\end{pmatrix}
\mkern-10mu}_{I \times J}
\]
\end{document}