迭代定义矩阵

迭代定义矩阵

我想知道是否有任何方法可以在 LaTeX 中迭代定义矩阵?例如,假设我想编写以下矩阵:

来源:https://en.wikipedia.org/wiki/Inverse_problem#An_elementary_example_:_Earth's_gravitational_field

当然,我可以使用 bmatrix 环境手动编写此矩阵,但为了便于论证,如果示例大得多,手动添加每个条目会很麻烦,该怎么办?那么最好能够使用宏定义矩阵(为清楚起见,使用伪代码语法):

#the matrix is size [m,n]
mymatrix = []
for i in range(m)
    for j in range(n)
        mymatrix[i,j] = \frac{G}{r^{2}_{i,j}}
    endfor
endfor

不幸的是,虽然我以前用过 LaTeX,但我从未使用过宏,所以我不知道从哪里开始做这样的事情,或者是否有可能。我重新发布了这个问题,因为我之前在 stack overflow 上发布过它,但没有得到任何评论。

谢谢您的帮助!

答案1

用 很容易nicematrix

\documentclass{article}
\usepackage{nicematrix}

\begin{document}
\NiceMatrixOptions{cell-space-top-limit = 2pt,cell-space-bottom-limit = 2pt}
\[
  F=\bAutoNiceMatrix{5-5}{\frac{G}{r^{2}_{\arabic{iRow}, \arabic{jCol}}}}
\]
\end{document}

在此处输入图片描述

答案2

一个相当通用的矩阵生成宏:

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

\ExplSyntaxOn

\NewDocumentCommand{\generatematrix}{O{b}mmmO{0pt}}
 {% #1 = fence (default b)
  % #2 = n. of rows
  % #3 = n. of cols
  % #4 = entry template
  % #5 = extra spacing
  \sandalwood_matrix_generate:nnnnn { #1 } { #2 } { #3 } { #4 } { #5 }
 }

\tl_new:N \l__sandalwood_matrix_body_tl

\cs_new_protected:Nn \sandalwood_matrix_generate:nnnnn
 {
  \group_begin:
  \cs_set_protected:Nn \__sandalwood_matrix_entry:nn { #4 }
  \tl_clear:N \l__sandalwood_matrix_body_tl
  % generate the first m-1 rows, with the possible extra spacing in between
  \int_step_inline:nn { #2 - 1 }
   {
    % the first object in a row gobbles a spurious &
    \tl_put_right:Nn \l__sandalwood_matrix_body_tl { \use_none:n }
    % fill the row
    \int_step_inline:nn { #3 }
     {
      \tl_put_right:Nn \l__sandalwood_matrix_body_tl
       {
        & \__sandalwood_matrix_entry:nn { ##1 } { ####1 }
       }
     }
    % add the extra spacing at the end of a row
    \tl_put_right:Nn \l__sandalwood_matrix_body_tl { \\ \noalign{\vspace{#5}} }
   }
  % fill the last row
  \tl_put_right:Nn \l__sandalwood_matrix_body_tl { \use_none:n }
  \int_step_inline:nn { #3 }
   {
    \tl_put_right:Nn \l__sandalwood_matrix_body_tl
     {
      & \__sandalwood_matrix_entry:nn { #2 } { ##1 }
     }
   }
  \begin{#1matrix}
  \tl_use:N \l__sandalwood_matrix_body_tl
  \end{#1matrix}
  \group_end:
 }

\ExplSyntaxOff

\newcommand{\hilbertmatrix}[1]{%
  \generatematrix{#1}{#1}{\frac{1}{\inteval{##1+##2-1}}}[1ex]%
}

\begin{document}

\[
\generatematrix{5}{5}{\dfrac{G}{r_{#1#2}^2}}[1ex]=
\generatematrix[v]{6}{4}{a_{#1,#2}}+\hilbertmatrix{4}
\]

\end{document}

前导可选参数(默认b)用于以标准amsmath方式说明栅栏的形状。尾随的强制参数应为长度(行之间的额外空间)。

的第三个强制参数\generatematrix是模板,其中#1表示行索引和#2列索引。我添加了如何根据定义宏来\generatematrix说明如果我们在定义中使用它,我们需要将它们转换为##1##2

在此处输入图片描述

知道这些操作毫无意义。

相关内容