I'm trying to create a large nxn matrix but I am unable to find a technique which will make it easier rather than doing it manually, any ideas?
4 Answers
This prints a random matrix with the specified size.
The keys are size
(mandatory), lb
for the lower bound on the random integers (default 0), ub
for the upper bound on the random integers (default 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}
Use Mathematica for example,
IdentityMatrix[10] // TeXForm
And copy the output for LaTeX as follows.
\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}
-
Note that: LaTeX generates some errors for n x n matrices with n>10. Commented Mar 4, 2019 at 16:39
Use the computer algebra system Sage along with the sagetex
package. First, here is the code:
\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}
Next, here is the output. Since some of my matrix constructions are random, it should look different than your run of the same code.
Finally, the basic construction is C = random_matrix(ZZ,4,3) where
- C is the matrix you're defining
- 4 is the number of rows
- 3 is the number of columns
- ZZ is for entries to be integers, QQ for rational, RR for real, CC for complex. You can also work with finite fields. See the documentation.
Note that I've shown how matrix A can be defined by you, entry by entry while B shows how Sage will create the 4x4 identity matrix for you. After you have your matrices set up, Sage will do the calculations as well. This prevents careless mistakes from creeping into your document. Sage isn't part of the LaTeX distribution but you can access it online with a free Cocalc account here. It is possible to install Sage on your computer so you don't need Cocalc. That is more difficult to get up and running. Some important documentation for working with matrices in SAGE is here, here, here, and here. Sage has no problem with big matrices but displaying them on the page becomes problematic. Using \usepackage{fullpage} in your code can free up space so that I print a 20 by 20 matrix.
-
Sorry. I have not tried it yet, can sagetex produce
.tex
(instead of.pdf
) file that can be rendered by MathJaX on web browsers? Commented Mar 5, 2019 at 8:18 -
1This is outside of my knowledge. However, this page from the Sagemath site mentions MathJax as follows "The eval function of this class converts a Sage object to its LaTeX representation and then wraps it in HTML that invokes the CSS “math” class, which then employs MathJax.". So it sounds like it might but I don't know for sure.– DJPCommented Mar 5, 2019 at 13:41
-
Matrices of normal random numbers using 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}
columns/name/.style={...}
is used a lot.