7

I am trying to draw a TikZ diagram that I would like to start counting from zero instead of one. I have adapted this answer for my needs.

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[auto matrix/.style={matrix of nodes,
  draw,thick,inner sep=0pt,
  nodes in empty cells,column sep=-0.2pt,row sep=-0.2pt,
  cells={nodes={minimum width=1.9em,minimum height=1.9em,
   draw,very thin,anchor=center,fill=white,
   execute at begin node={%
   $\vphantom{x_|}\ifnum\the\pgfmatrixcurrentrow<4
     \ifnum\the\pgfmatrixcurrentcolumn<4
      {#1}^{\the\pgfmatrixcurrentrow}_{\the\pgfmatrixcurrentcolumn}
     \else 
      \ifnum\the\pgfmatrixcurrentcolumn=5
       {#1}^{\the\pgfmatrixcurrentrow}_{N}
      \fi
     \fi
    \else
     \ifnum\the\pgfmatrixcurrentrow=5
      \ifnum\the\pgfmatrixcurrentcolumn<4
       {#1}^{T}_{\the\pgfmatrixcurrentcolumn}
      \else
       \ifnum\the\pgfmatrixcurrentcolumn=5
        {#1}^{T}_{N}
       \fi 
      \fi
     \fi
    \fi  
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=14
     \cdots
    \fi
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=41
     \vdots
    \fi
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=44
     \ddots
    \fi$
    }
  }}}]
 \matrix[auto matrix=z,xshift=3em,yshift=3em](matz){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \matrix[auto matrix=y,xshift=1.5em,yshift=1.5em](maty){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \matrix[auto matrix=x](matx){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \draw[thick,-stealth] ([xshift=1ex]matx.south east) -- ([xshift=1ex]matz.south east)
  node[midway,below] {$D$};
 \draw[thick,-stealth] ([yshift=-1ex]matx.south west) -- 
  ([yshift=-1ex]matx.south east) node[midway,below] {joints};
 \draw[thick,-stealth] ([xshift=-1ex]matx.north west)
   -- ([xshift=-1ex]matx.south west) node[midway,above,rotate=90] {time};
\end{tikzpicture}
\end{document}

This code has the following output.

enter image description here

I would like the index to begin from zero. Something like this.

enter image description here

I tried using the calc package to subtract from the \the\pgfmatrixcurrentrow and the \the\pgfmatrixcurrentcolumn like $\the\pgfmatrixcurrentrow - 1 = \result$ but to no avail. Any help is greatly appreciated.

Rashiq
  • 337

2 Answers2

6

You can use \pgfmathtruncatemacro to compute your desired numbers just before all the code into the matrix definition, and replace all \the\pgfmatrixcurrentrow and \the\pgfmatrixcurrentcolumn by your computed variables.

multiple matrix planes with pgfmath

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[auto matrix/.style={matrix of nodes,
  draw,thick,inner sep=0pt,
  nodes in empty cells,column sep=-0.2pt,row sep=-0.2pt,
  cells={nodes={minimum width=1.9em,minimum height=1.9em,
   draw,very thin,anchor=center,fill=white,
   execute at begin node={%
   \pgfmathtruncatemacro{\nrow}{\the\pgfmatrixcurrentrow-1}%
   \pgfmathtruncatemacro{\ncol}{\the\pgfmatrixcurrentcolumn-1}%
   $\vphantom{x_|}\ifnum\the\pgfmatrixcurrentrow<4
     \ifnum\the\pgfmatrixcurrentcolumn<4
      {#1}^{\nrow}_{\ncol}     
     \else 
      \ifnum\the\pgfmatrixcurrentcolumn=5
       {#1}^{\nrow}_{N}
      \fi
     \fi
    \else
     \ifnum\the\pgfmatrixcurrentrow=5
      \ifnum\the\pgfmatrixcurrentcolumn<4
       {#1}^{T}_{\ncol}
      \else
       \ifnum\the\pgfmatrixcurrentcolumn=5
        {#1}^{T}_{N}
       \fi 
      \fi
     \fi
    \fi  
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=14
     \cdots
    \fi
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=41
     \vdots
    \fi
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=44
     \ddots
    \fi$
    }
  }}}]
 \matrix[auto matrix=z,xshift=3em,yshift=3em](matz){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \matrix[auto matrix=y,xshift=1.5em,yshift=1.5em](maty){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \matrix[auto matrix=x](matx){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \draw[thick,-stealth] ([xshift=1ex]matx.south east) -- ([xshift=1ex]matz.south east)
  node[midway,below] {$D$};
 \draw[thick,-stealth] ([yshift=-1ex]matx.south west) -- 
  ([yshift=-1ex]matx.south east) node[midway,below] {joints};
 \draw[thick,-stealth] ([xshift=-1ex]matx.north west)
   -- ([xshift=-1ex]matx.south west) node[midway,above,rotate=90] {time};
\end{tikzpicture}
\end{document}
SebGlav
  • 19,186
4

Since these are integers, use \the\numexpr\pgfmatrixcurrentrow-1

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[auto matrix/.style={matrix of nodes,
  draw,thick,inner sep=0pt,
  nodes in empty cells,column sep=-0.2pt,row sep=-0.2pt,
  cells={nodes={minimum width=1.9em,minimum height=1.9em,
   draw,very thin,anchor=center,fill=white,
   execute at begin node={%
   $\vphantom{x_|}\ifnum\the\pgfmatrixcurrentrow<4
     \ifnum\the\pgfmatrixcurrentcolumn<4
      {#1}^{\the\numexpr\pgfmatrixcurrentrow-1}_{\the\numexpr\pgfmatrixcurrentcolumn-1}
     \else 
      \ifnum\the\pgfmatrixcurrentcolumn=5
       \,{#1}^{\the\numexpr\pgfmatrixcurrentrow-1}_{N}
      \fi
     \fi
    \else
     \ifnum\the\pgfmatrixcurrentrow=5
      \ifnum\the\pgfmatrixcurrentcolumn<4
       {#1}^{T}_{\the\numexpr\pgfmatrixcurrentcolumn-1}
      \else
       \ifnum\the\pgfmatrixcurrentcolumn=5
        \,{#1}^{T}_{N}
       \fi 
      \fi
     \fi
    \fi  
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=14
     \cdots
    \fi
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=41
     \vdots
    \fi
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=44
     \ddots
    \fi$
    }
  }}}]
 \matrix[auto matrix=z,xshift=3em,yshift=3em](matz){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \matrix[auto matrix=y,xshift=1.5em,yshift=1.5em](maty){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \matrix[auto matrix=x](matx){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \draw[thick,-stealth] ([xshift=1ex]matx.south east) -- ([xshift=1ex]matz.south east)
  node[midway,below] {$D$};
 \draw[thick,-stealth] ([yshift=-1ex]matx.south west) -- 
  ([yshift=-1ex]matx.south east) node[midway,below] {joints};
 \draw[thick,-stealth] ([xshift=-1ex]matx.north west)
   -- ([xshift=-1ex]matx.south west) node[midway,above,rotate=90] {time};
\end{tikzpicture}
\end{document}

I also added \, in the last column to avoid too much overlapping.

enter image description here

egreg
  • 1,121,712