如何自动构建一个具有相同系数和不同根的mxn矩阵?

如何自动构建一个具有相同系数和不同根的mxn矩阵?

假设我有一个如下所示的 mxn 矩阵

\documentclass{article}
\usepackage{amsmath}
\newcommand*{\vth}{\vartheta}
\newcommand*{\vph}{\varphi}
\newcommand*{\pt}[1]{\left(#1\right)}

    \begin{document}
    
\begin{equation}
\begin{bmatrix}\vph_{11}&\vph_{12}&\vph_{13}&\vph_{14}&\vph_{15}&\vph_{16}&\dot{x}\pt{T}\\
\vph_{21}&\vph_{22}&\vph_{23}&\vph_{24}&\vph_{25}&\vph_{26}&\dot{y}\pt{T}\\
\vph_{31}&\vph_{32}&\vph_{33}&\vph_{34}&\vph_{35}&\vph_{36}&\dot{z}\pt{T}\\
\vph_{41}&\vph_{42}&\vph_{43}&\vph_{44}&\vph_{45}&\vph_{46}&\ddot{x}\pt{T}\\
\vph_{51}&\vph_{52}&\vph_{53}&\vph_{54}&\vph_{55}&\vph_{56}&\ddot{y}\pt{T}\\
\vph_{61}&\vph_{62}&\vph_{63}&\vph_{64}&\vph_{65}&\vph_{66}&\ddot{z}\pt{T}\end{bmatrix}
\end{equation}

    \end{document}

在此处输入图片描述

我如何使用宏来构建这样的矩阵,以便例如说我只想要行 1、3、5 和列 1、3、5?

我正在考虑类似 \automatrix{\vph}{1;3;5}{1;3;5} 的东西,其中第一个输入是公共变量 \vph,第二个输入是我想要包含的行(因此是第一个 pedices),第三个输入是列(第二个 pedices)。

如果可以像图中一样在“自动”矩阵中也包含一个附加列,那就太好了!

谢谢你!

答案1

您可以使用该tabularray包:

\documentclass{article}
\usepackage{amsmath}
\newcommand*{\vth}{\vartheta}
\newcommand*{\vph}{\varphi}
\newcommand*{\pt}[1]{\left(#1\right)}
\usepackage{tabularray}
\UseTblrLibrary{counter,amsmath}
\begin{document}

\begin{equation}
\begin{+bmatrix}[cell{1-Z}{1-Y}={cmd={\vph_{\arabic{rownum}\arabic{colnum}}}}]
&&&&&&\dot{x}\pt{T}\\
&&&&&&\dot{x}\pt{T}\\
&&&&&&\dot{x}\pt{T}\\
&&&&&&\dot{x}\pt{T}\\
&&&&&&\dot{x}\pt{T}\\
&&&&&&\dot{x}\pt{T}\\
\end{+bmatrix}
\end{equation}

\end{document}

在此处输入图片描述

答案2

我只想要第 1、3、5 行和第 1、3、5 列

至少可以用三种方式来解释这一点。

  1. 第 1、3、5 行和第 1、3、5 列的所有条目都折叠成一个填充矩阵。
  2. 行 1,3,5 和列 1,3,5 中的所有条目均保留原始矩阵中的原样。
  3. 行 1,3,5 或列 1,3,5 中的所有条目都保留在原始矩阵中。

我将为每种解释提供一些代码。在每种情况下,代码在效率方面可能都不是最优的,但对于个人使用来说应该足够了。很多灵感都来自 egreg 的回答这里

下面的每个命令都有以下键。希望它们是不言自明的。

  • symbol=<symbol>, 最初\varphi
  • rows=<integer>
  • cols=<integer>
  • row-spec=<comma list of integers>
  • col-spec=<comma list of integers>
  • final-col=<comma list of entries>

方法 1

这里你可以提供rows或但不能同时提供两者。和 也row-spec类似。colscol-spec

\documentclass{article}
\usepackage{amsmath}

\ExplSyntaxOn

\NewDocumentCommand { \automatrix } { m }
  {
    \group_begin:
    \keys_set:nn { mascolo/automatrix } { #1 }
    \mascolo_automatrix:
    \group_end:
  }

\tl_new:N \l__mascolo_automatrix_tl

\keys_define:nn { mascolo/automatrix }
  {
    symbol    .tl_set:N    = \l__mascolo_automatrix_symbol_tl,
    symbol    .initial:n   = \varphi,
    rows      .int_set:N   = \l__mascolo_automatrix_totrows_int,
    cols      .int_set:N   = \l__mascolo_automatrix_totcols_int,
    row-spec  .clist_set:N = \l__mascolo_automatrix_rowspec_clist,
    col-spec  .clist_set:N = \l__mascolo_automatrix_colspec_clist,
    final-col .clist_set:N = \l__mascolo_automatrix_finalcol_clist,
  }

\cs_new_protected:Nn \mascolo_automatrix:
  {
    \int_compare:nT
      {
        \int_max:nn { \l__mascolo_automatrix_totrows_int }
          { \l__mascolo_automatrix_totcols_int } > \value{MaxMatrixCols}
      }
      {
        \setcounter{MaxMatrixCols}
          {
            \int_max:nn { \l__mascolo_automatrix_totrows_int }
              { \l__mascolo_automatrix_totcols_int }
          }
      }
    \clist_if_empty:NTF \l__mascolo_automatrix_rowspec_clist
      {
        \int_step_function:nN { \l__mascolo_automatrix_totrows_int }
          \__mascolo_automatrix_row:n
      }
      {
        \int_step_inline:nn
          { \fp_eval:n { max( \l__mascolo_automatrix_rowspec_clist ) } }
          {
            \clist_if_in:NnTF \l__mascolo_automatrix_rowspec_clist { ##1 }
              { \__mascolo_automatrix_row:n { ##1 } }
              { \clist_pop:NN \l__mascolo_automatrix_finalcol_clist \l_tmpa_tl }
          }
      }
    \begin{bmatrix}
    \l__mascolo_automatrix_tl
    \end{bmatrix}
  }

\cs_new_protected:Nn \__mascolo_automatrix_row:n
  {
    \clist_if_empty:NTF \l__mascolo_automatrix_colspec_clist
      { \__mascolo_automatrix_row_nocolspec:n { #1 } }
      { \__mascolo_automatrix_row_withcolspec:n { #1 } }
  }

\cs_new_protected:Nn \__mascolo_automatrix_row_nocolspec:n
  {
    \tl_put_right:Nn \l__mascolo_automatrix_tl
      { \l__mascolo_automatrix_symbol_tl \sb{ #1,1 } }
    \int_step_inline:nnn { 2 } { \l__mascolo_automatrix_totcols_int }
      {
        \tl_put_right:Nn \l__mascolo_automatrix_tl
          {
            &
            \l__mascolo_automatrix_symbol_tl \sb{ #1,##1 }
          }
      }
    \clist_pop:NNTF \l__mascolo_automatrix_finalcol_clist \l_tmpa_tl
      {
        \tl_put_right:Nn \l__mascolo_automatrix_tl { & }
        \tl_put_right:NV \l__mascolo_automatrix_tl \l_tmpa_tl
      }
      { }
    \tl_put_right:Nn \l__mascolo_automatrix_tl { \\ }
  }

\cs_new_protected:Nn \__mascolo_automatrix_row_withcolspec:n
  {
    \tl_put_right:Nn \l__mascolo_automatrix_tl
      {
        \l__mascolo_automatrix_symbol_tl
        \sb{ #1,\clist_item:Nn \l__mascolo_automatrix_colspec_clist{1} }
      }
    \int_step_inline:nnn { 2 } { \clist_count:N \l__mascolo_automatrix_colspec_clist }
      {
        \tl_put_right:Nn \l__mascolo_automatrix_tl
          {
            &
            \l__mascolo_automatrix_symbol_tl
            \sb{ #1,\clist_item:Nn \l__mascolo_automatrix_colspec_clist { ##1 } }
          }
      }
    \clist_pop:NNTF \l__mascolo_automatrix_finalcol_clist \l_tmpa_tl
          {
            \tl_put_right:Nn \l__mascolo_automatrix_tl { & }
            \tl_put_right:NV \l__mascolo_automatrix_tl \l_tmpa_tl
          }
          { }
    \tl_put_right:Nn \l__mascolo_automatrix_tl { \\ }
  }

\ExplSyntaxOff

\begin{document}

\[
\automatrix{rows=4,cols=5,symbol=\xi,final-col={w,x,y,z}}
\quad
\automatrix{cols=5,row-spec={2,4},final-col={w,x,y,z}}
\]
\[
\automatrix{rows=4,col-spec={2,4}}
\quad
\automatrix{row-spec={2,4},col-spec={2,4}}
\]

\end{document}

尝试1

方法 2

这里需要键rows和,cols因为我们需要提前知道原始矩阵有多大。

\documentclass{article}
\usepackage{amsmath}

\ExplSyntaxOn

\NewDocumentCommand { \automatrixalt } { m }
  {
    \group_begin:
    \keys_set:nn { mascolo/automatrixalt } { #1 }
    \mascolo_automatrixalt:
    \group_end:
  }

\tl_new:N \l__mascolo_automatrixalt_tl

\keys_define:nn { mascolo/automatrixalt }
  {
    symbol    .tl_set:N         = \l__mascolo_automatrixalt_symbol_tl,
    symbol    .initial:n        = \varphi,
    rows      .int_set:N        = \l__mascolo_automatrixalt_totrows_int,
    rows      .value_required:n = true,
    cols      .int_set:N        = \l__mascolo_automatrixalt_totcols_int,
    cols      .value_required:n = true,
    row-spec  .clist_set:N      = \l__mascolo_automatrixalt_rowspec_clist,
    col-spec  .clist_set:N      = \l__mascolo_automatrixalt_colspec_clist,
    final-col .clist_set:N      = \l__mascolo_automatrixalt_finalcol_clist,
  }

\cs_new_protected:Nn \mascolo_automatrixalt:
  {
    \int_compare:nT
      {
        \int_max:nn { \l__mascolo_automatrixalt_totrows_int }
          { \l__mascolo_automatrixalt_totcols_int } > \value{MaxMatrixCols}
      }
      {
        \setcounter{MaxMatrixCols}
          {
            \int_max:nn { \l__mascolo_automatrixalt_totrows_int }
              { \l__mascolo_automatrixalt_totcols_int }
          }
      }
    \clist_if_empty:NTF \l__mascolo_automatrixalt_rowspec_clist
      {
        \int_step_function:nN { \l__mascolo_automatrixalt_totrows_int }
          \__mascolo_automatrixalt_row:n
      }
      {
        \int_step_inline:nn
          { \l__mascolo_automatrixalt_totrows_int }
          {
            \clist_if_in:NnTF \l__mascolo_automatrixalt_rowspec_clist { ##1 }
              { \__mascolo_automatrixalt_row:n { ##1 } }
              {
                \clist_pop:NN \l__mascolo_automatrixalt_finalcol_clist \l_tmpa_tl
                \tl_put_right:Nn \l__mascolo_automatrixalt_tl { \\ }
              }
          }
      }
    \begin{bmatrix}
    \l__mascolo_automatrixalt_tl
    \end{bmatrix}
  }

\cs_new_protected:Nn \__mascolo_automatrixalt_row:n
  {
    \clist_if_empty:NTF \l__mascolo_automatrixalt_colspec_clist
      { \__mascolo_automatrixalt_row_nocolspec:n { #1 } }
      { \__mascolo_automatrixalt_row_withcolspec:n { #1 } }
  }

\cs_new_protected:Nn \__mascolo_automatrixalt_row_nocolspec:n
  {
    \tl_put_right:Nn \l__mascolo_automatrixalt_tl
      { \l__mascolo_automatrixalt_symbol_tl \sb{ #1,1 } }
    \int_step_inline:nnn { 2 } { \l__mascolo_automatrixalt_totcols_int }
      {
        \tl_put_right:Nn \l__mascolo_automatrixalt_tl
          {
            &
            \l__mascolo_automatrixalt_symbol_tl \sb{ #1,##1 }
          }
      }
    \clist_pop:NNTF \l__mascolo_automatrixalt_finalcol_clist \l_tmpa_tl
      {
        \tl_put_right:Nn \l__mascolo_automatrixalt_tl { & }
        \tl_put_right:NV \l__mascolo_automatrixalt_tl \l_tmpa_tl
      }
      { }
    \tl_put_right:Nn \l__mascolo_automatrixalt_tl { \\ }
  }

\cs_new_protected:Nn \__mascolo_automatrixalt_row_withcolspec:n
  {
    \tl_put_right:Nn \l__mascolo_automatrixalt_tl
      {
        \clist_if_in:NnTF \l__mascolo_automatrixalt_colspec_clist { 1 }
          { \l__mascolo_automatrixalt_symbol_tl \sb{ #1,1 } }
          { \phantom{ \l__mascolo_automatrixalt_symbol_tl \sb{ #1,1 } } }
      }
    \int_compare:nNnT { \l__mascolo_automatrixalt_totcols_int } > { 1 }
      {
        \int_step_inline:nnn { 2 } { \l__mascolo_automatrixalt_totcols_int }
          {
            \tl_put_right:Nn \l__mascolo_automatrixalt_tl
              {
                &
                \clist_if_in:NnTF \l__mascolo_automatrixalt_colspec_clist { ##1 }
                  { \l__mascolo_automatrixalt_symbol_tl \sb{ #1,##1 } }
                  { \phantom{ \l__mascolo_automatrixalt_symbol_tl \sb{ #1,##1 } } }
              }
          }
      }
    \clist_pop:NNTF \l__mascolo_automatrixalt_finalcol_clist \l_tmpa_tl
      {
        \tl_put_right:Nn \l__mascolo_automatrixalt_tl { & }
        \tl_put_right:NV \l__mascolo_automatrixalt_tl \l_tmpa_tl
      }
      { }
    \tl_put_right:Nn \l__mascolo_automatrixalt_tl { \\ }
  }

\ExplSyntaxOff

\begin{document}

\[
\automatrixalt{rows=4,cols=5,symbol=\xi,final-col={w,x,y,z}}
\quad
\automatrixalt{rows=4,cols=5,row-spec={2,4},final-col={w,x,y,z}}
\]
\[
\automatrixalt{rows=4,cols=5,col-spec={2,4}}
\quad
\automatrixalt{rows=4,cols=5,row-spec={2,4},col-spec={2,4}}
\]

\end{document}

尝试2

方法 3

与方法 2 一样,这里需要键rows和。cols

\documentclass{article}
\usepackage{amsmath}

\ExplSyntaxOn

\NewDocumentCommand { \automatrixaltii } { m }
  {
    \group_begin:
    \keys_set:nn { mascolo/automatrixaltii } { #1 }
    \mascolo_automatrixaltii:
    \group_end:
  }

\tl_new:N \l__mascolo_automatrixaltii_tl

\keys_define:nn { mascolo/automatrixaltii }
  {
    symbol    .tl_set:N         = \l__mascolo_automatrixaltii_symbol_tl,
    symbol    .initial:n        = \varphi,
    rows      .int_set:N        = \l__mascolo_automatrixaltii_totrows_int,
    rows      .value_required:n = true,
    cols      .int_set:N        = \l__mascolo_automatrixaltii_totcols_int,
    cols      .value_required:n = true,
    row-spec  .clist_set:N      = \l__mascolo_automatrixaltii_rowspec_clist,
    col-spec  .clist_set:N      = \l__mascolo_automatrixaltii_colspec_clist,
    final-col .clist_set:N      = \l__mascolo_automatrixaltii_finalcol_clist,
  }

\cs_new_protected:Nn \mascolo_automatrixaltii:
  {
    \int_compare:nNnT
      {
        \int_max:nn { \l__mascolo_automatrixaltii_totrows_int }
          { \l__mascolo_automatrixaltii_totcols_int }
      }
      > { \value{MaxMatrixCols} }
      {
        \setcounter{MaxMatrixCols}
          {
            \int_max:nn { \l__mascolo_automatrixaltii_totrows_int }
              { \l__mascolo_automatrixaltii_totcols_int }
          }
      }
    \clist_if_empty:NTF \l__mascolo_automatrixaltii_rowspec_clist
      {
        \int_step_function:nN { \l__mascolo_automatrixaltii_totrows_int }
          \__mascolo_automatrixaltii_row:n
      }
      {
        \int_step_inline:nn
          { \l__mascolo_automatrixaltii_totrows_int }
          {
            \clist_if_in:NnTF \l__mascolo_automatrixaltii_rowspec_clist { ##1 }
              { \__mascolo_automatrixaltii_row_nocolspec:n { ##1 } }
              { \__mascolo_automatrixaltii_row_notinrowspec:n { ##1 } }
          }
      }
    \begin{bmatrix}
    \l__mascolo_automatrixaltii_tl
    \end{bmatrix}
  }

\cs_new_protected:Nn \__mascolo_automatrixaltii_row:n
  {
    \clist_if_empty:NTF \l__mascolo_automatrixaltii_colspec_clist
      { \__mascolo_automatrixaltii_row_nocolspec:n { #1 } }
      { \__mascolo_automatrixaltii_row_notinrowspec:n { #1 } }
  }

\cs_new_protected:Nn \__mascolo_automatrixaltii_row_nocolspec:n
  {
    \tl_put_right:Nn \l__mascolo_automatrixaltii_tl
      { \l__mascolo_automatrixaltii_symbol_tl \sb{ #1,1 } }
    \int_step_inline:nnn { 2 } { \l__mascolo_automatrixaltii_totcols_int }
      {
        \tl_put_right:Nn \l__mascolo_automatrixaltii_tl
          {
            &
            \l__mascolo_automatrixaltii_symbol_tl \sb{ #1,##1 }
          }
      }
    \clist_pop:NNTF \l__mascolo_automatrixaltii_finalcol_clist \l_tmpa_tl
      {
        \tl_put_right:Nn \l__mascolo_automatrixaltii_tl { & }
        \tl_put_right:NV \l__mascolo_automatrixaltii_tl \l_tmpa_tl
      }
      { }
    \tl_put_right:Nn \l__mascolo_automatrixaltii_tl { \\ }
  }

\cs_new_protected:Nn \__mascolo_automatrixaltii_row_notinrowspec:n
  {
    \tl_put_right:Nn \l__mascolo_automatrixaltii_tl
      {
        \clist_if_in:NnTF \l__mascolo_automatrixaltii_colspec_clist { 1 }
          { \l__mascolo_automatrixaltii_symbol_tl \sb{ #1,1 } }
          { \phantom{ \l__mascolo_automatrixaltii_symbol_tl \sb{ #1,1 } } }
      }
    \int_compare:nNnT { \l__mascolo_automatrixaltii_totcols_int } > { 1 }
      {
        \int_step_inline:nnn { 2 } { \l__mascolo_automatrixaltii_totcols_int }
          {
            \tl_put_right:Nn \l__mascolo_automatrixaltii_tl
              {
                &
                \clist_if_in:NnTF \l__mascolo_automatrixaltii_colspec_clist { ##1 }
                  { \l__mascolo_automatrixaltii_symbol_tl \sb{ #1,##1 } }
                  { \phantom{ \l__mascolo_automatrixaltii_symbol_tl \sb{ #1,##1 } } }
              }
          }
      }
    \tl_put_right:Nn \l__mascolo_automatrixaltii_tl { \\ }
    \clist_pop:NN \l__mascolo_automatrixaltii_finalcol_clist \l_tmpa_tl
  }

\ExplSyntaxOff

\begin{document}

\[
\automatrixaltii{rows=4,cols=5,symbol=\xi,final-col={w,x,y,z}}
\quad
\automatrixaltii{rows=4,cols=5,row-spec={2,4},final-col={w,x,y,z}}
\]
\[
\automatrixaltii{rows=4,cols=5,col-spec={2,4}}
\quad
\automatrixaltii{rows=4,cols=5,row-spec={2,4},col-spec={2,4}}
\]

\end{document}

尝试3

相关内容