矩阵分解维度图

矩阵分解维度图

制作如下描绘矩阵维度的图表的最简单方法是什么?

在此处输入图片描述

我可以用简单的下标来实现,但我喜欢这些图表给出的视觉效果。

答案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}

结果:

矩阵方程

显然,这无法与 Segletes 先生的强大而通用的答案相比!但是,它确实使用了更基本的命令,这可能具有以下好处:在较慢的机器上编译速度更快,并且即使在缺少软件包的较小安装中也可以工作。或者也许你只是喜欢亲自动手。当然,缺点是你必须自己确定所有的宽度、高度和深度。

注意:如果您使用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}

相关内容