
Qual é a maneira mais fácil de fazer diagramas representando dimensões de matrizes como os seguintes?
Posso fazer isso com subscritos simples, mas gosto do efeito visual que esses diagramas proporcionam.
Responder1
Aqui faço isso com pilhas, colocando os índices abaixo das caixas. A macro principal é
\matbox{rows}{columns}{row index}{column index}{matrix name}
.
Uma macro auxiliar é \raiserows
, que é semelhante a \raisebox
, exceto que o "comprimento" é especificado em linhas, e não no comprimento real. Observe que no MWE, por X
ter 7 linhas, enquanto P^T
possui apenas 2 linhas, P^T
deve ser levantado (7-2)/2 = 2,5 linhas.
Apresento o fator \matscale
para dimensionar o tamanho da sua caixa. Por padrão, cada linha e coluna do tamanho da caixa ocupará um quadrado de tamanho \baselineskip
de cada lado. O fator \matscale
(que tem como padrão 1) dimensionará esse valor.
EDITADO para definir índices de array em\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ó para esclarecer, caso não tenha ficado claro. Pode-se usar dimensões de matriz reais (muito grandes), desde que a escala seja adequadamente pequena. Por exemplo, o seguinte 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}$
Responder2
Aqui está uma maneira de fazer isso "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 isto não se compara à resposta poderosa e geral do Sr. Segletes! Ele usa comandos mais básicos, no entanto, que podem ter os benefícios de serem mais rápidos de compilar em uma máquina lenta e funcionarão mesmo com uma instalação menor sem pacotes. Ou talvez você apenas goste de sujar as mãos. A desvantagem, claro, é que você mesmo precisa determinar todas as larguras, alturas e profundidades.
Nota: se você usar mathtools
qualquer outro pacote que forneça um \clap
comando, ele entrará em conflito com a definição. Neste caso, basta omitir esta definição e usar a \clap
fornecida.
Responder3
Esta é uma solução possível via amsmath
pacote.
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}