Диаграмма размеров разложения матрицы

Диаграмма размеров разложения матрицы

Какой самый простой способ создания диаграмм, отображающих размеры матрицы, подобных следующей?

введите описание изображения здесь

Я могу сделать это с помощью простых нижних индексов, но мне нравится визуальный эффект, который дают эти диаграммы.

решение1

Здесь я делаю это со стеками, устанавливая индексы под ящиками. Основной макрос —

\matbox{rows}{columns}{row index}{column index}{matrix name}.

Вспомогательный макрос — это \raiserows, который похож на \raisebox, за исключением того, что «длина» указывается в строках, а не фактическая длина. Обратите внимание, что в MWE, поскольку Xимеет 7 строк, в то время как P^Tимеет только 2 строки, P^Tнеобходимо поднять (7-2)/2 = 2,5 строки.

Я ввожу фактор \matscaleдля масштабирования размеров вашего блока. По умолчанию каждая строка и столбец размера блока будут занимать квадрат размером \baselineskipна стороне. Фактор \matscale(который по умолчанию равен 1) будет масштабировать это значение.

ОТРЕДАКТИРОВАНО для установки индексов массива в\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}

введите описание изображения здесь


Просто для ясности, если это не было понятно. Можно использовать реальные (очень большие) размеры матрицы, если масштабировать ее достаточно мало. Например, работает следующее::

$\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}$

решение2

Вот способ сделать это «вручную».

\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}

Результат:

Матричное уравнение

Очевидно, это не идет ни в какое сравнение с мощным и общим ответом г-на Сеглетеса! Однако он использует более простые команды, что может иметь преимущества в виде более быстрой компиляции на медленной машине, и он будет работать даже с небольшой установкой, в которой не хватает пакетов. Или, может быть, вам просто нравится пачкать руки. Недостаток, конечно, в том, что вам придется самостоятельно определять все ширины, высоты и глубины.

Примечание: если вы используете mathtoolsили любой другой пакет, который предоставляет \clapкоманду, это будет конфликтовать с определением. В этом случае просто опустите это определение и используйте предоставленное \clap.

решение3

Это одно из возможных решений с помощью amsmathпакета.

введите описание изображения здесь

Код

\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}

Связанный контент