我有一个矩阵,需要突出显示矩阵中的某些元素。我找到了如何突出显示单个元素的方法(我想将单元格放在方块中):
$$ A = \begin{bmatrix}
\fbox{0} & \fbox{0} & 0 \\
\fbox{0} & \fbox{0} & 0 \\
1 & 1 & 1 \\
\end{bmatrix}$$
但是我怎样才能像下图这样勾勒出子矩阵的元素呢?我只需要一个包含一些元素的框架。
答案1
你可以使用 TikZ,并且
fit
用于创建适合所需区域的节点的库,- 突出显示节点的样式,以便与代码分离并易于更改,
- TikZ 选项
overlay
和remember picture
,以便您以后可以参考这些节点,例如稍后绘制箭头和注释。
为了说明为什么有节点作为参考很有用,我创建了一个示例,该示例展示了转置矩阵,突出显示了原始矩阵和结果中的子矩阵,并通过箭头连接并标注:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{fit}
\tikzset{%
highlight/.style={rectangle,rounded corners,fill=red!15,draw,
fill opacity=0.5,thick,inner sep=0pt}
}
\newcommand{\tikzmark}[2]{\tikz[overlay,remember picture,
baseline=(#1.base)] \node (#1) {#2};}
%
\newcommand{\Highlight}[1][submatrix]{%
\tikz[overlay,remember picture]{
\node[highlight,fit=(left.north west) (right.south east)] (#1) {};}
}
\begin{document}
\[
M = \left(\begin{array}{*5{c}}
\tikzmark{left}{1} & 2 & 3 & 4 & 5 \\
6 & 7 & 8 & 9 & 10 \\
11 & 12 & \tikzmark{right}{13} & 14 & 15 \\
16 & 17 & 18 & 19 & 20
\end{array}\right)
\Highlight[first]
\qquad
M^T = \left(\begin{array}{*5{c}}
\tikzmark{left}{1} & 6 & 11 & 16 \\
2 & 7 & 12 & 17 \\
3 & 8 & \tikzmark{right}{13} & 18 \\
4 & 9 & 14 & 19 \\
5 & 10 & 15 & 20
\end{array}\right)
\]
\Highlight[second]
%
\tikz[overlay,remember picture] {
\draw[->,thick,red,dashed] (first) -- (second) node [pos=0.66,above] {Transpose};
\node[above of=first] {$N$};
\node[above of=second] {$N^T$};
}
\end{document}
答案2
我推荐 TikZ。结果:
代码:
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{arrows,matrix,positioning}
\begin{document}
\begin{tikzpicture}
\matrix [matrix of math nodes,left delimiter=(,right delimiter=)] (m)
{
8 &8 &1 &6 \\
3 &8 &5 &7 \\
4 &8 &9 &5 \\
};
\draw[color=red] (m-1-1.north west) -- (m-1-3.north east) -- (m-2-3.south east) -- (m-2-1.south west) -- (m-1-1.north west);
\draw[color=red,double,implies-](m-1-2.north) -- +(0,0.3);
\end{tikzpicture}
\end{document}
答案3
您可以\tikzmark
使用Andrew Stacey 的回答标记您想要放置框的端点。这允许您以通常的方式(在 之外tikz
)执行矩阵。由于这与 Werner 使用 的解决方案非常相似pstricks
,因此我改编了该代码以使用\tikzmark
:
笔记:
- 这确实需要两次运行:第一次计算框的位置,第二次将其绘制在正确的位置。
- 由于这是使用的
tikz
,您可以自动获得固有的所有灵活性tikz
,例如线条样式、线条粗细、线条颜色、填充等。这些可以传递给\DrawBox
宏以自定义每个实例,或作为默认选项提供以保持一致性。
更新:
- 增强版可访问我怎样才能给矩阵添加一些增强功能它允许您在矩阵中拥有多个框选区域,并且还可以选择在每个框下方添加标签。
代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand{\DrawBox}[1][]{%
\tikz[overlay,remember picture]{
\draw[red,#1]
($(left)+(-0.2em,0.9em)$) rectangle
($(right)+(0.2em,-0.3em)$);}
}
\begin{document}
\[
M = \left[\begin{array}{*{13}{c}}
\tikzmark{left}0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 0 & 0 \\
1 & 0 & 1 & 0 & 0 & 0 & 1 & 1 & 0 & 1 & 0 & 1 & 0 \\
0 & 1 & 0\tikzmark{right} & 1 & 0 & 0 & 0 & 1 & 1 & 1 & 1 & 0 & 1 \\
0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\
0 & 0 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\
1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\
0 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 1 & 1 \\
0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\
1 & 1 & 1 & 0 & 0 & 0 & 1 & 1 & 0 & 0 & 0 & 1 & 0 \\
0 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 1 \\
0 & 1 & 1 & 0 & 1 & 0 & 0 & 1 & 1 & 1 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 0
\end{array}\right]
\]
\DrawBox[thick]
\end{document}
答案4
这是一种仅使用 LaTeX 的“内置”命令\cline
并\multicolumn
围绕左上角 3x3 子矩阵创建框架的方法。
顺便说一句,因为你的矩阵有超过 10 列,所以我认为有必要使用环境array
而不是环境bmatrix
(bmatrix
本质上是构造周围的“包装器” array
)或者增加计数器MaxMatrixCols
以避免在通过设置 13 列矩阵时出现不受欢迎的意外bmatrix
。
另外,对于当前的情况,我不会加载该array
包;如果您要加载该array
包,您会得到一个(大概是不受欢迎的)副作用,即第 3 列和第 4 列之间的列间空间会随着框架线的宽度而扩大。
\documentclass{article}
\begin{document}
\[ M = \left[ \:
% \: serves as a spacer between the left-hand bracket of
% the matrix and the left-hand side of the inner frame
\begin{array}{*{13}{c}}
\cline{1-3}
\multicolumn{1}{|c}{0} & 1 & \multicolumn{1}{c|}{0}
& 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 0\\
\multicolumn{1}{|c}{1} & 0 & \multicolumn{1}{c|}{1}
& 0 & 0 & 0 & 1 & 1 & 0 & 1 & 0 & 1 & 0\\
\multicolumn{1}{|c}{0} & 1 & \multicolumn{1}{c|}{0}
& 1 & 0 & 0 & 0 & 1 & 1 & 1 & 1 & 0 & 1\\
\cline{1-3}
0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 0 & 0 & 0\\
0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 0\\
\end{array}
\right] \]
\end{document}