编写递归矩阵模式

编写递归矩阵模式

考虑以下矩阵

\begin{equation}
\begin{pmatrix}
     B_{0,0} & B_{0,1} \\
     B_{1,0} & B_{1,1} 
\end{pmatrix}
\end{equation}

迭代中的下一个矩阵将用以下矩阵替换 B_{i,j}

\begin{equation}
\begin{pmatrix}
     B_{i0,j0} & B_{i0,j1} \\
     B_{i1,j0} & B_{i1,j1} 
\end{pmatrix}
\end{equation}

对于 i 和 j = 0 , 1,得到一个 4 x 4 矩阵。有没有简单的方法(使用 for 循环)来写下这个?我们可以继续这个构造(参见下面的评论)来得到一个 8 x 8 矩阵,依此类推。

答案1

并非真正递归。但是,嘿,它有效!

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\recursematrix}{O{B}m}
 {% #1 is the (optional) symbol for the coefficient, #2 is the step
  \begin{pmatrix}
  \passerby_recursematrix:nn { #1 } { #2 }
  \end{pmatrix}
 }

\tl_new:N \l_passerby_recursebody_tl

\cs_new_protected:Nn \passerby_recursematrix:nn
 {
  \int_step_inline:nnnn { 0 } { 1 } { \fp_to_int:n { 2**#2 } - 1}
   {
    \int_step_inline:nnnn { 0 } { 1 } { \fp_to_int:n { 2**#2 } -1 }
     {
      \tl_put_right:Nx \l_passerby_recursebody_tl
       {
        \exp_not:n { #1 }
        \sb
         {
          \passerby_padded_binary:nn { #2 } { ##1 },
          \passerby_padded_binary:nn { #2 } { ####1 }
         }
        &
       }
     }
    \tl_put_right:Nn \l_passerby_recursebody_tl { \hspace{-2\arraycolsep} \\ }
   }
   \tl_use:N \l_passerby_recursebody_tl
 }

\cs_new_protected:Nn \passerby_padded_binary:nn
 {
  \int_compare:nTF { #2 = 0 }
   {
    \prg_replicate:nn { #1 } { 0 }
   }
   {
    \prg_replicate:nn { #1 - 1 - \fp_to_int:n { floor( ln(#2)/ln(2) ) } } { 0 }
    \int_to_bin:n { #2 }
   }
 }

\ExplSyntaxOff

\begin{document}

\[
\recursematrix{1}
\]
\[
\recursematrix{2}
\]
\[
\recursematrix{3}
\]

\end{document}

在此处输入图片描述

这是用来说明可选参数的输出\recursematrix[X]{4}。它还需要

\setcounter{MaxMatrixCols}{17}

在此处输入图片描述

答案2

我认为前两个矩阵是 OP 所要求的。

我相信我也已经达到了第三级。关键在于认识到索引基本上是二进制(基数为 2)表示法。

编辑,为了跟上 egreg,我也做了第 4 级。

\documentclass[landscape]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{amsmath}
\newcommand\Amatrix[2]{%
  \begin{matrix}
     B_{{#1}0,{#2}0} & B_{{#1}0,{#2}1} \\ B_{{#1}1,{#2}0} & B_{{#1}1,{#2}1} 
  \end{matrix}
}
\makeatletter
\newcommand\makeAnmatrix[1]{%
  \expandafter\newcommand\csname #1matrix\endcsname[2]{%
    \begin{matrix}
      \csname\@gobble#1matrix\endcsname{{##1}0}{{##2}0} &  
      \csname\@gobble#1matrix\endcsname{{##1}0}{{##2}1}\\
      \csname\@gobble#1matrix\endcsname{{##1}1}{{##2}0} &
      \csname\@gobble#1matrix\endcsname{{##1}1}{{##2}1}
    \end{matrix}
  }%
}
\makeatother
\makeAnmatrix{AA} % ALLOWS TO DEPTH 2
\makeAnmatrix{AAA} % ALLOWS TO DEPTH 3
\makeAnmatrix{AAAA} % ALLOWS TO DEPTH 4
\begin{document}
\begin{equation*}\begin{pmatrix}\Amatrix{}{}\end{pmatrix}\end{equation*}
\begin{equation*}\begin{pmatrix}\AAmatrix{}{}\end{pmatrix}\end{equation*}
\begin{equation*}\begin{pmatrix}\AAAmatrix{}{}\end{pmatrix}\end{equation*}
\tiny
\begin{equation*}\begin{pmatrix}\AAAAmatrix{}{}\end{pmatrix}\end{equation*}
\end{document}

在此处输入图片描述

在此处输入图片描述

相关内容