
我想在矩陣中標記幾個塊,並且按照其他類似問題的指示進行操作,但我得到了一種奇怪的 TikZ 行為..似乎我在矩陣中不能有多個標記塊?我想展示的是阻塞吉文斯旋轉的模板,用於消除從某列開始的對角線下的非零元素,其中我更新對角線上的塊(紅色),然後可以處理尾隨列或行右側的塊(綠色)。
更新:使用答案作為輸入,我實現了我的最終用例。
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{calc,fit,matrix,arrows,automata,positioning}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand{\tikzdrawbox}[3][]{%
\tikz[overlay,remember picture]{
\draw[#3,#1]
($(left#2)+(-0.2em,0.9em)$) rectangle
($(right#2)+(0.2em,-0.3em)$);}
}
\newcommand\x{\times}
\begin{equation}\label{eq:blockedgivens}
\newcommand\y{\colorbox{myred}{$\times$}}
\newcommand\z{\colorbox{mygray}{$\times$}}
\left(\begin{array}{ccccccccccccccc}
\x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x \\
0 & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x \\
0 & 0 & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x \\
0 & 0 & 0 & \tikzmark{left1}\x & \x & \x & \x & \tikzmark{left3}\x & \x & \x & \x & \x & \x & \x & \x \\
0 & 0 & 0 & \z & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x \\
0 & 0 & 0 & 0 & \z & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x \\
0 & 0 & 0 & 0 & 0 & \z & \x & \x & \x & \x & \x & \x & \x & \x & \x \\
0 & 0 & 0 & 0 & 0 & 0 & \z & \tikzmark{left2} \x \tikzmark{right1} & \x & \x & \x & \tikzmark{left4} \x & \x & \x & \x \tikzmark{right3}\\
0 & 0 & 0 & 0 & 0 & 0 & 0 & \z & \x & \x & \x & \x & \x & \x & \x \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \z & \x & \x & \x & \x & \x & \x \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \z & \x & \x & \x & \x & \x \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \z & \x \tikzmark{right2} & \x & \x & \x \tikzmark{right4} \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \z & \x & \x & \x \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \z & \x & \x \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \z & \x \\
\end{array}\right)
\tikzdrawbox[thick]{1}{red}
\tikzdrawbox[thick]{2}{red}
\tikzdrawbox[thick]{3}{green}
\tikzdrawbox[thick]{4}{green}
\end{equation}
答案1
每個塊都需要自己的一對標記;我改變了\tikzdrawbox
;的定義第一個強制參數是用於標記的數字;第二個可選參數可讓您將選項傳遞給,\draw
並且可選參數可讓您對區塊尺寸指定一些「修正」以防止某些邊框重疊:
\documentclass{article}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{calc,fit,matrix,arrows,automata,positioning}
\newcommand\x{\times}
\newcommand\y{\colorbox{red}{$\times$}}
\newcommand\z{\colorbox{gray}{$\times$}}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand{\tikzdrawbox}[3][(0pt,0pt)]{%
\tikz[overlay,remember picture]{
\draw[#3]
($(left#2)+(-0.3em,0.9em) + #1$) rectangle
($(right#2)+(0.2em,-0.4em) - #1$);}
}
\begin{document}
\begin{equation}\label{eq:blockedgivens}
\left(\begin{array}{ccccccccccccccc}
\x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x \\
0 & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x \\
0 & 0 & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x \\
0 & 0 & 0 & \tikzmark{left1}\x & \x & \x & \x & \tikzmark{left3}\x & \x & \x & \x & \x & \x & \x & \x \\
0 & 0 & 0 & \z & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x \\
0 & 0 & 0 & 0 & \z & \x & \x & \x & \x & \x & \x & \x & \x & \x & \x \\
0 & 0 & 0 & 0 & 0 & \z & \x & \x & \x & \x & \x & \x & \x & \x & \x \\
0 & 0 & 0 & 0 & 0 & 0 & \z & \tikzmark{left2} \x \tikzmark{right1} & \x & \x & \x & \tikzmark{left4} \x & \x & \x & \x \tikzmark{right3} \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & \z & \x & \x & \x & \x & \x & \x & \x \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \z & \x & \x & \x & \x & \x & \x \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \z & \x & \x & \x & \x & \x \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \z & \x \tikzmark{right2} & \x & \x & \x \tikzmark{right4} \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \z & \x & \x & \x \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \z & \x & \x \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \z & \x \\
\end{array}\right)
\tikzdrawbox{1}{thick,red}
\tikzdrawbox{2}{thick,red}
\tikzdrawbox[(-1pt,2pt)]{3}{thick,green}
\tikzdrawbox[(-4pt,2pt)]{4}{thick,green}
\end{equation}
\end{document}
答案2
如果您沒有太多特殊條目(您可以包含更多 if 情況),您可以稍微縮短程式碼。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{equation}\label{eq:blockedgivens}
\left(
\begin{tikzpicture}[baseline=(current bounding box.center)]
\begin{scope}[xscale=0.6,yscale=0.4]
\foreach \x in {1,...,14}
\foreach \y in {1,...,14}
{
\ifnum\x<\y
\node (my-\y-\x) at (\x,-\y) {$0$};
\else
\node (my-\y-\x) at (\x,-\y) {$\times$};
\fi
}
\end{scope}
\draw[red] (my-4-4.north west) rectangle (my-8-8.south east);
\draw[red] (my-8-8.north west) rectangle (my-12-12.south east);
\end{tikzpicture}
\right)
\end{equation}
\end{document}