是否可以创建一个函数从矩阵中提取子矩阵?例如
\[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}
需要记住的最重要的一点是,基于 Python 并允许您访问 Python 的 SAGE 的默认起始索引为 0。因此,从矩阵中删除第一行和第一列的方法是:D= A.delete_rows([0]).delete_columns([0])
。在 LaTeX 中,矩阵周围的内容是delimiters
,在 SAGE 中更改它们的文档是这里。代码latex.matrix_delimiters(left='|', right='|')
改变了分隔符,以便我可以在 LaTeX 中显示行列式。
SAGE 不是 LaTeX 的一部分。最简单的入门方法是使用免费的可钙帐户。