
次のようなマトリックス次元を示す図を作成する最も簡単な方法は何ですか?
単純な下付き文字でもできますが、これらの図が与える視覚効果が気に入っています。
答え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
1 辺に 1 つの正方形のサイズを占めます。係数\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
これはパッケージを介した 1 つの可能な解決策です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}