突出显示矩阵中的元素

突出显示矩阵中的元素

我有一个矩阵,需要突出显示矩阵中的某些元素。我找到了如何突出显示单个元素的方法(我想将单元格放在方块中):

$$ A = \begin{bmatrix}
\fbox{0} & \fbox{0} & 0 \\ 
\fbox{0} & \fbox{0} & 0 \\
1 & 1 & 1 \\ 
\end{bmatrix}$$

但是我怎样才能像下图这样勾勒出子矩阵的元素呢?我只需要一个包含一些元素的框架。

子矩阵

答案1

你可以使用 TikZ,并且

  • fit用于创建适合所需区域的节点的库,
  • 突出显示节点的样式,以便与代码分离并易于更改,
  • TikZ 选项overlayremember 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而不是环境bmatrixbmatrix本质上是构造周围的“包装器” 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}

在此处输入图片描述

相关内容