Diagrama de dimensões de decomposição de matriz

Diagrama de dimensões de decomposição de matriz

Qual é a maneira mais fácil de fazer diagramas representando dimensões de matrizes como os seguintes?

insira a descrição da imagem aqui

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 Xter 7 linhas, enquanto P^Tpossui apenas 2 linhas, P^Tdeve ser levantado (7-2)/2 = 2,5 linhas.

Apresento o fator \matscalepara dimensionar o tamanho da sua caixa. Por padrão, cada linha e coluna do tamanho da caixa ocupará um quadrado de tamanho \baselineskipde 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}

insira a descrição da imagem aqui


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:

Equação matricial

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 mathtoolsqualquer outro pacote que forneça um \clapcomando, ele entrará em conflito com a definição. Neste caso, basta omitir esta definição e usar a \clapfornecida.

Responder3

Esta é uma solução possível via amsmathpacote.

insira a descrição da imagem aqui

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}

informação relacionada