答案1
这是根据我的回答得出的初步结论矩阵分解维度图。
框的语法是\matbox{rows}{row-label}{columns}{column-label}{box-title}
。例如,\matbox{3}{dimensions}{8}{documents}{...}
创建一个有 3 行标记为“维度”和 8 列标记为“文档”的框。
为了允许使用复杂的框标题,我引入了\titlebox[width]{primary-math-label}{sub-text}
。框可以用垂直移动\raiserows{row-shift}{box-to-be-shifted}
。row-shift
应该将设置为矩阵行高差的 1/2。例如,这里高矩阵有 7 行,小矩阵有 3 行高。因此移位为 .5(7-3) = 2。
\documentclass{article}
\usepackage{stackengine,graphicx}
\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]{
\raisebox{2.3ex}{\rotatebox[origin=center]{90}{\scalebox{.45}{#2}}}\,%
\stackon{\dimbox{#1}{#3}{#5}}{\scalebox{.45}{#4}}}
\newcommand\titlebox[3][30ex]{\stackanchor{#2}{\scalebox{.45}{\parbox{#1}{\centering #3}}}}
\begin{document}
\[\renewcommand\matscale{.6}
\matbox{7}{words}{8}{documents}{%
\titlebox[20ex]{X}{transformed word-document co-occurance matrix}}
=
\matbox{7}{words}{3}{dimensions}{\titlebox[10ex]{U}{word space}}
\raiserows{2}{\matbox{3}{dimensions}{3}{dimensions}{\titlebox{D}{weights}}}
\stackunder[6pt]{%
\raiserows{2}{\matbox{3}{dimensions}{8}{documents}{\titlebox{V^T}{document space}}}%
}{\scalebox{.6}{LSA}}
\]
\end{document}
使用默认的\matscale=1
,一行将占据 的高度1\baselineskip
。因此,可以通过重置 来全局更改框大小\matscale
。在上面的 MWE 中,我将值重置为 .6,这样 7 行占据 .6(7) =4.2\baselineskip
的垂直距离。行数和列数可以设置为实际矩阵值,这些值可以非常大,只要\matscale
和行/列值的大小一起适当减小 即可。
\matscale
下面是改为0.8后的样子: