从矩阵中提取子矩阵的函数

从矩阵中提取子矩阵的函数

是否可以创建一个函数从矩阵中提取子矩阵?例如

\[A=\begin{pmatrix}
    5 & 0 & 0\\
    0 & 2 & -5\\
    6 & 1 & -2
\end{pmatrix}\]

函数c{1,1}(删除第一行和第一列的子矩阵)并得到

\[\begin{pmatrix}
    2 & -5\\
    1 & -2
\end{pmatrix}\]

我的目标是以更简单的方式编写子矩阵及其行列式,以便不必逐一编写它们。有什么解决方案或想法吗?

答案1

我制作了一些命令来存储矩阵并显示矩阵、矩阵元素或子矩阵。矩阵元素已保存<matrix name>-<y>-<x>,因此您可以用它定义进一步的命令。

结果

在此处输入图片描述

代码

\documentclass{article}

\usepackage{etoolbox}
\usepackage{pgffor}
\usepackage{booktabs}

\def\dmname{}
\newcounter{dmx}
\newcounter{dmy}
\newcommand{\dmlines}[1]{%
    \setcounter{dmx}{0}
    \forcsvlist{\dmelements}{#1}
    \stepcounter{dmy}
}
\newcommand{\dmelements}[1]{%
    \csdef{\dmname-\thedmy-\thedmx}{#1}%
    \stepcounter{dmx}%
}
\newcommand{\definematrix}[2]{%
    % #1 = name
    % #2 = matrix
    \gdef\dmname{#1}%
    \setcounter{dmy}{0}%
    \forcsvlist{\dmlines}{#2}%
    \csxdef{\dmname-w}{\thedmx}%
    \csxdef{\dmname-h}{\thedmy}%
}

\newcommand{\getmatrixelement}[3]{%
    % #1 = name
    % #2 = y
    % #3 = x
    \csuse{#1-#2-#3}%
}

\newcommand{\getsubmatrix}[5]{%
    % #1 = name
    % #2 = y
    % #3 = x
    % #4 = y2
    % #5 = x2
    \def\dmtablecontent{}%
    \foreach \y in {#2, ..., #4} {%
        \foreach \x in {#3, ..., #5} {%
            \xappto\dmtablecontent{\csuse{#1-\y-\x}}%
            \ifnumless{\x}{#5}{%
                \xappto\dmtablecontent{&}%
            }{}%
        }%
        \xappto\dmtablecontent{\\}%
    }%
    %
    \begin{tabular}{*{\the\numexpr#5-#3+1\relax}{c}}%
        \dmtablecontent%
    \end{tabular}%
}

\newcommand{\getmatrixwidth}[1]{%
    % #1 = name
    \csuse{#1-w}%
}

\newcommand{\getmatrixheight}[1]{%
    % #1 = name
    \csuse{#1-h}%
}

\newcommand{\getmatrix}[1]{%
    % #1 = name
    \getsubmatrix{#1}{0}{0}
    {\the\numexpr\getmatrixheight{#1}-1\relax}
    {\the\numexpr\getmatrixwidth{#1}-1\relax}%
}

\newcommand{\getmatrixwithoutrc}[3]{%
    % shows the matrix without the given row and column
    % #1 = name
    % #2 = row
    % #3 = column
    \def\dmtablecontent{}%
    \def\dmymax{\the\numexpr\getmatrixheight{#1}-1\relax}%
    \def\dmxmax{\the\numexpr\getmatrixwidth{#1}-1\relax}%
    \foreach \y in {0, ..., \dmymax} {%
        \ifnumequal{\y}{#2}{}{%
            \foreach \x in {0, ..., \dmxmax} {%
                \ifnumequal{\x}{#3}{}{%
                    \xappto\dmtablecontent{\csuse{#1-\y-\x}}%
                    \ifnumless{\x}{\dmxmax}{%
                        \xappto\dmtablecontent{&}%
                    }{}%
                }%
            }%
            \xappto\dmtablecontent{\\}%
        }%
    }%
    %
    \begin{tabular}{*{\getmatrixwidth{#1}}{c}}
        \dmtablecontent
    \end{tabular}
}

\begin{document}

\definematrix{a}{{1, 2}, {3, 4}}
\definematrix{b}{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}

\renewcommand{\arraystretch}{1.5}
\begin{tabular}{ll}
    \toprule
    \textbf{Result} & \textbf{Command}\\
    \midrule
    & \verb|\definematrix{a}{{1, 2}, {3, 4}}|\\
    & \verb|\definematrix{b}{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}| \\
    $\getmatrixheight{a} \times \getmatrixwidth{a}$ &
    \verb|$\getmatrixheight{a} \times \getmatrixwidth{a}$|
    \\
    \getmatrix{a} &
    \verb|\getmatrix{a}|
    \\
    \getmatrixelement{a}{0}{0} &
    \verb|\getmatrixelement{a}{0}{0}|
    \\
    \getmatrixelement{a}{1}{0} &
    \verb|\getmatrixelement{a}{1}{0}|
    \\
    \getsubmatrix{a}{0}{1}{1}{1} &
    \verb|\getsubmatrix{a}{0}{1}{1}{1}|
    \\
    \getmatrix{b} &
    \verb|\getmatrix{b}|
    \\
    \getsubmatrix{b}{1}{1}{2}{2} &
    \verb|\getsubmatrix{b}{1}{1}{2}{2}|
    \\
    \getmatrixwithoutrc{b}{1}{1} &
    \verb|\getmatrixwithoutrc{b}{1}{1}|
    \\
    \bottomrule
\end{tabular}

\end{document}

答案2

这是一个鼠尾草使用 SAGE(一种计算机代数系统 (CAS))进行求解。有关矩阵基础知识的文档这里矩阵的完整文档以 PDF 格式提供这里。通过 685 页的文档,您会发现 SAGE 几乎可以完成您想要的任何事。

\documentclass{article}
\usepackage{sagetex,amsmath,amsfonts}
\linespread{2.0}
\begin{document}
\begin{sagesilent}
latex.matrix_delimiters(left='[', right=']')
A=matrix([[5,0,0],[0,2,-5],[6,1,-2]])
B = matrix(4,[0..15])
C= B.delete_rows([0,3]).delete_columns([1,2])
D= A.delete_rows([0]).delete_columns([0])
\end{sagesilent}
Consider the matrices below:  \[A=\sage{A} \hspace{2cm} B=\sage{B}\] 

The entry $A_{1,1}=\sage{A[0][0]}$ because SAGE is Python 
based and indices start with $0$. We can create submatrices $C=\sage{C}$ and    $D=\sage{D}$ by 
deleting rows and columns. SAGE can calculate $C \cdot D = \sage{C*D}$ and its  determinant:
\begin{sagesilent}
latex.matrix_delimiters(left='|', right='|')
\end{sagesilent}
$det(C \cdot D)=\sage{C*D}=\sage{det(C*D)}$
\end{document}

在 Cocalc 中运行的结果: 在此处输入图片描述

需要记住的最重要的一点是,基于 Python 并允许您访问 Python 的 SAGE 的默认起始索引为 0。因此,从矩阵中删除第一行和第一列的方法是:D= A.delete_rows([0]).delete_columns([0])。在 LaTeX 中,矩阵周围的内容是delimiters,在 SAGE 中更改它们的文档是这里。代码latex.matrix_delimiters(left='|', right='|')改变了分隔符,以便我可以在 LaTeX 中显示行列式。

SAGE 不是 LaTeX 的一部分。最简单的入门方法是使用免费的可钙帐户。

相关内容