
大きな nxn マトリックスを作成しようとしていますが、手動で行うよりも簡単にできる手法が見つかりません。何かアイデアはありますか?
答え1
指定されたサイズのランダムな行列を出力します。
キーはsize
(必須)、lb
ランダムな整数の下限 (デフォルト 0)、ub
ランダムな整数の上限 (デフォルト 20) です。
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\bigmatrix}{m}
{
\group_begin:
\keys_set:nn { john/bigmatrix } { #1 }
\john_bigmatrix:
\group_end:
}
\tl_new:N \l__john_bigmatrix_tl
\keys_define:nn { john/bigmatrix }
{
size .int_set:N = \l__john_bigmatrix_size_int,
lb .int_set:N = \l__john_bigmatrix_lb_int,
ub .int_set:N = \l__john_bigmatrix_ub_int,
lb .initial:n = 0,
ub .initial:n = 20,
}
\cs_new_protected:Nn \john_bigmatrix:
{
\int_compare:nT { \l__john_bigmatrix_size_int > \value{MaxMatrixCols} }
{
\setcounter{MaxMatrixCols}{\l__john_bigmatrix_size_int}
}
\int_step_function:nN { \l__john_bigmatrix_size_int } \__john_bigmatrix_row:n
\begin{bmatrix}
\l__john_bigmatrix_tl
\end{bmatrix}
}
\cs_new_protected:Nn \__john_bigmatrix_row:n
{
\tl_put_right:Nx \l__john_bigmatrix_tl
{
\int_rand:nn { \l__john_bigmatrix_lb_int } { \l__john_bigmatrix_ub_int }
}
\prg_replicate:nn { \l__john_bigmatrix_size_int - 1 }
{
\tl_put_right:Nx \l__john_bigmatrix_tl
{
&
\int_rand:nn { \l__john_bigmatrix_lb_int } { \l__john_bigmatrix_ub_int }
}
}
\tl_put_right:Nn \l__john_bigmatrix_tl { \\ }
}
\ExplSyntaxOff
\begin{document}
$\bigmatrix{size=5}$ $\bigmatrix{size=6,lb=-12,ub=12}$
\bigskip
$\bigmatrix{size=15,ub=50}$
\end{document}
答え2
例えばMathematicaを使うと、
IdentityMatrix[10] // TeXForm
そして、LaTeX の出力を次のようにコピーします。
\documentclass[border=12pt,12pt]{standalone}
\usepackage{amsmath}
\begin{document}
$A=
\begin{pmatrix}
1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\
\end{pmatrix}
$
\end{document}
答え3
パッケージと一緒にコンピュータ代数システム Sage を使用しますsagetex
。まず、コードは次のとおりです。
\documentclass{article}
\usepackage{sagetex}
\begin{document}
\begin{sagesilent}
latex.matrix_delimiters(left='[', right=']')
A = Matrix([[0,-1,-1],[-1,-1,0],[-1,0,1],[1,0,0],[0,0,-1],[-1,2,1]])
B = Matrix.identity(4)
C = random_matrix(ZZ,4,3)
D = random_matrix(QQ,3,4)
\end{sagesilent}
The matrix $A=\sage{A}$ was input by hand. The matrix $B=\sage{B}$ is defined in Sage.
The matrix $C=\sage{C}$ is $4 \times 4$ matrix consisting of integers determined
at random. The matrix $D=\sage{D}$ is a $3 \times 4$ matrix consisting of rational
numbers determined randomly.
Computing $C \cdot D= \sage{C*D}$ is easy. You can compute use Sage to test if
matrices are singular or nonsingular and even calculate their inverses.
Sage will take care of the calculations but
you'll have to spend time making the output look a little nicer.
\end{document}
次に、出力を示します。一部の行列構成はランダムなので、同じコードを実行した場合とは異なる結果になるはずです。
最後に、基本的な構成はC = random_matrix(ZZ,4,3)であり、
- Cは定義する行列です
- 4は行数です
- 3は列の数です
- ZZ はエントリが整数の場合、QQ は有理数の場合、RR は実数の場合、CC は複素数の場合です。有限体でも作業できます。ドキュメントを参照してください。
行列 A は、エントリごとに定義できる方法を示しましたが、B は、Sage が 4x4 単位行列を作成する方法を示しています。行列を設定したら、Sage が計算も行います。これにより、不注意なミスが文書に紛れ込むのを防ぎます。Sage は LaTeX ディストリビューションの一部ではありませんが、無料の Cocalc アカウントを使用してオンラインでアクセスできます。ここSageをコンピュータにインストールしてCocalcを使わなくてもよいようにすることも可能です。ただし、その場合は起動と実行が難しくなります。SAGEで行列を扱うための重要なドキュメントは、ここ、ここ、ここ、 そしてここSage は大きな行列でも問題ありませんが、ページ上に表示すると問題が生じます。コード内で \usepackage{fullpage} を使用すると、スペースが解放され、20 x 20 の行列を印刷できるようになります。
答え4
正規乱数の行列knitr
:
\documentclass{article}
\usepackage{amsmath}
<<bmatrix,echo=F>>=
options(digits=2)
bmatrix <- function(matr) {
printmrow <- function(x) {cat(cat(x,sep=" & "),"\\\\ \n")}
cat("\\begin{bmatrix}","\n")
body <- apply(matr,1,printmrow)
cat("\\end{bmatrix}")}
@
\begin{document}
\[ A =
<<echo=F,results='asis'>>=
bmatrix(round(matrix(rnorm(6), 2 ,3),3))
@
\]
\[ B =
<<echo=F,results='asis'>>=
bmatrix(round(matrix(abs(rnorm(120)), 12 ,10),1))
@
\]
\setcounter{MaxMatrixCols}{12}
\[ C =
<<echo=F,results='asis'>>=
bmatrix(round(matrix(abs(rnorm(144)), 12 ,12),1))
@
\]
\end{document}