使用 Tikz 绘制 25x25 矩阵时出现问题

使用 Tikz 绘制 25x25 矩阵时出现问题

我需要绘制一个 25x25 的矩阵,如下所示: 在此处输入图片描述

由于我需要添加颜色和箭头(这是一个示意图),所以我决定使用 Tikz 包来绘制它。我尝试了很多方法,但我发现更好的方法是:

\documentclass[10pt, a4paper]{article}
\usepackage{tikz}
\begin{document}

\begin{figure}
    \begin{center}
        \begin{tikzpicture}
        \draw (0,0) -- (0, 15);
        \draw (0,0) -- (15, 0);
        \draw (15,0) -- (15, 15);
        \draw (0,15) -- (15, 15);
        
        \foreach \i in {14.4, 13.8, 13.2, 12.6, 12, ..., 0.0}
            \ifnum \i<>11.4  {\node at (-\i + 15, 0.6) {0};} \else {\node at (-\i + 15, 0.6) {-1};}\fi;
        \end{tikzpicture}

        \caption{} \label{}
    \end{center}
\end{figure}

\end{document}

输出以下矩阵:

在此处输入图片描述

您可能已经理解,我的目的是逐行重新创建矩阵,从画布的下部到上部,用相应的数字填充每个位置。显然,为了做到这一点,必须检查的位置以\i放置 0、4 或 -1。例如,在第一行中,当\i = 13.8和时,我需要放置 -1 \i = 11.4。问题是我不知道如何正确使用 if 语句,使用嵌套 if 或多个条件会很方便,但我无法编写该部分的代码,我所拥有的只是我在此处发布的内容。任何生成矩阵的方法都将不胜感激。

笔记:该盒子的尺寸为每 15 个元素,每个节点之间的距离为 0.6,从而保证可以容纳 25x25 个元素。

答案1

这可能是一个起点

\documentclass[border=9,tikz]{standalone}
\begin{document}

\pgfkeys{
    /big toeplitz/-2/.code={a},
    /big toeplitz/-1/.code={b},
    /big toeplitz/0/.code={c},
    /big toeplitz/1/.code={d},
    /big toeplitz/2/.code={e},
    /big toeplitz/.unknown/.code={0}
}
\tikz{
    \draw[scale=.5]
        foreach \x in {1,...,15}{
            foreach \y in {1,...,15}{
                (\x,\y)node{
                    \pgfmathtruncatemacro\difxy{\x - \y}
                    \pgfkeys{/big toeplitz/\difxy}
                }
            }
        }
    ;
}

\end{document}

答案2

我懂了一个巧妙的解决方案@Symbol 1 使用 TikZ 的\pgfkeys。如果愿意使用 Asymptote,那么我认为以下解决方案最简单,并且更容易进行微调,例如添加颜色、缩放等。可以像往常一样嵌入到 LaTeX 中。此外,还有几个优点:代码简单,大小固定。

在此处输入图片描述

// http://asymptote.ualberta.ca/
size(10cm);
int n=25;

for (int i=1; i<n+1; ++i)
for (int j=1; j<n+1; ++j)
if (i==j) label(scale(.8)*"4",(i,-j),red);
else if (abs(i-j)==1) label(scale(.8)*"-1",(i,-j),blue);
else if (abs(i-j)==5) label(scale(.8)*"-1",(i,-j),orange);
else label(scale(.8)*"0",(i,-j));

real a=.5;
draw((1-a,-1+a)--(1-a,-n-a)^^(n+a,-1+a)--(n+a,-n-a),linewidth(1pt));
shipout(bbox(5mm,invisible)); 

更新0根据 OP 的要求,上对角线和下对角线

在此处输入图片描述

size(10cm);
int n=15;

for (int i=1; i<n+1; ++i)
for (int j=1; j<n+1; ++j)
if (i==j) label("$4$",(i,-j),red);
else if ((i-j==1) & (j%5 != 0) ) label("$-1$",(i,-j),blue);
else if ((i-j==-1) & (i%5 != 0)) label("$-1$",(i,-j),blue);
else if (abs(i-j)==5) label("$-1$",(i,-j),purple);
else label("$0$",(i,-j));

相关内容