16

I sort of have the same issue as this question, but the reverse.

It is often the case that I need to write out a matrix in LaTeX, one resulting from a computation of some sort. Of course, the computation itself is often most easily performed in WolframAlpha, or other such software.

Consider, for instance, the operation of squaring a matrix here. I also will want the third, fourth, and fifth powers of this matrix.

Writing this in LaTeX is quite time-consuming and cumbersome. WolframAlpha does however provide a sort of formatting for the answer: a "copyable plain text" option, and a "Wolfram Language plain text output:"

enter image description here

If I could somehow convert either of these outputs into the resulting matrix, given by

   \begin{pmatrix}
   1/4 & 0 & 1/2 & 1/4 \\
   0 & 0 & 0 & 1 \\
   1/2 & 0 & 0 & 1/2 \\
   1/4 & 1/4 & 0 & 1/2
   \end{pmatrix}

that would reduce quite a bit of (in my opinion) unnecessary work.

That is, I would hypothetically like some macro, say \wamatrix such that using

 \wamtrix{ 1/4(1 | 0 | 2 | 1
 0 | 0 | 0 | 4
 2 | 0 | 0 | 2
 1 | 1 | 0 | 2) }

or

 \wamatrix{ {{1/4, 0, 1/2, 1/4}, {0, 0, 0, 1}, {1/2, 0, 0, 1/2}, {1/4, 1/4, 0, 1/2}} }

would give me the same result as using

   \begin{pmatrix}
   1/4 & 0 & 1/2 & 1 \\
   0 & 0 & 0 & 1 \\
   1/2 & 0 & 0 & 1/2 \\
   1/4 & 1/4 & 0 & 1/2
   \end{pmatrix}

(And, of course, the matrix should not necessarily be this specific one, or even one of the same size, ideally.)

I don't know how feasible this is, but if anyone could help, it would be greatly appreciated!

6 Answers6

12

Here, I digest the matrix with a token cycle and typeset it with a TAB stack. The token cycle echoes the input tokens except for commas. In the case of commas, they are replaced with either a & or a \\, depending on the grouping depth within the input. The TAB stack typesets this revised token stream.

Note that row spacing and column gap are settable parameters.

\documentclass{article}
\usepackage{tabstackengine,tokcycle}
\Characterdirective{\tctestifx{,#1}
   {\ifnum\tcdepth<2\addcytoks{\\}\else\addcytoks{&}\fi}
   {\addcytoks{#1}}%
}
\stripgroupingtrue
\setstacktabbedgap{1.5ex}% INTERCOLUMN GAP
\setstackgap{L}{1.2\normalbaselineskip}% INTERROW BASELINESKIP
\newcommand\wamatrix[1]{%
  \tokcyclexpress{#1}%
  \expandafter\parenMatrixstack\expandafter{\the\cytoks}
}
\begin{document}
\[
  \mathbf{X} =
  \wamatrix{ {{1/4, 0, 1/2, 1/4}, {0, 0, 0, 1}, {1/2, 0, 0, 1/2}, {1/4, 1/4, 0, 1/2}} }
\]
\end{document}

enter image description here

If one really wanted to enter the \wamatrix call with the extra set of braces that the OP showed,

\wamatrix{ {{1/4, 0, 1/2, 1/4}, {0, 0, 0, 1}, 
  {1/2, 0, 0, 1/2}, {1/4, 1/4, 0, 1/2}} }

then one would merely need to change the \tcdepth check from <1 to <2, in the \Characterdirective, as in

\Characterdirective{\tctestifx{,#1}
   {\ifnum\tcdepth<2\addcytoks{\\}\else\addcytoks{&}\fi}
   {\addcytoks{#1}}%
}
11

Append // TeXForm to your WolframAlpha query. Then under the "Exact result" panel, click "Plain text" and copy. Try your example here.

TeXForm is a built-in function in the Wolfram Language, which underlies WolframAlpha and Mathematica.

hftf
  • 2,283
10

It might not be the easiest way to do this, but you could use the xstring package to do some reformatting of the code:

\documentclass{article}
\usepackage{amsmath}
\usepackage{xstring}

\newcommand{\wamatrix}[1]{% \StrRemoveBraces{#1}[\waouterraw]% \StrSubstitute{\waouterraw}{,}{\}[\waouter]% \StrRemoveBraces{\waouter}[\wainnerraw]% \StrSubstitute{\wainnerraw}{,}{&}[\wainner]% \begin{pmatrix} \wainner \end{pmatrix}% }

\begin{document}

[ \wamatrix{ {{1/4, 0, 1/2, 1/4}, {0, 0, 0, 1}, {1/2, 0, 0, 1/2}, {1/4, 1/4, 0, 1/2}} } ]

\end{document}

enter image description here

Note that xstring macros by default only process the characters in a string up to the next grouping level. For example \StrSubstitute{aaa{a}a}{a}{b} would result in bbb{a}b (while the braces are not printed in the output). Similarly, \StrRemoveBraces by default only removes the outermost pair of braces. This behaviour was used here to first split the string (which conveniently contains braces to group the items) into lines and then into cells.

10

Here is a sagetex implementation:

\documentclass{article}
\usepackage{amsmath,amsfonts,amssymb,sagetex,setspace}
\doublespacing
\begin{document}
\begin{sagesilent}
latex.matrix_delimiters(left='[', right=']')
A = Matrix([[0,1/2,0,1/2],[0,0,1,0],[0,0,0,1],[1/2,0,0,1/2]])
\end{sagesilent}
If I start with $A = \sage{A}$ then it is easy to   calculate\\
$A^2=\sage{A^2}$, $A^3=\sage{A^3}$,$A^4=\sage{A^4}$, $A^5=\sage{A^5}$.
\end{document}

The output from Cocalc is: enter image description here

The setspace package is used to change the spacing between the lines to doublespace so it isn't as crowded. \sage{} is used to get a mathematical calculation from Sage. The beauty of using a CAS is all you need to do is input the matrix properly and Sage will get the answer without mistakes.

DJP
  • 12,451
  • Thank you for (re-)introducing us all to \sage. One (admittedly uglier, but potentially also useful depending on the OP's original needs) similar alternative may be Knittr with the symbolic math package caracas and its latex output. – Landak Oct 27 '21 at 20:56
9

Not sure if this is simple or qualitatively different from some of the other answers, but one can also use pgf to loop over the nested lists and build the matrix contents. Notice that this does not explicitly use global macros, and also works if some entries are "not expandable" macros.

\documentclass{article}
\usepackage{amsmath}
\usepackage{pgffor}
\newtoks\wamatrixtoks
\newif\ifwamatrixfirstcol
\wamatrixfirstcoltrue
\newif\ifwamatrixfirstrow
\wamatrixfirstrowtrue
\pgfkeys{wamatrix/warow/.code={%
  \ifwamatrixfirstcol
    \wamatrixfirstcolfalse
    \wamatrixtoks=\expandafter{\the\expandafter\wamatrixtoks#1}%
  \else
   \wamatrixtoks=\expandafter{\the\expandafter\wamatrixtoks\expandafter&#1}%
  \fi 
},wamatrix/warows/.code={%
  \ifwamatrixfirstrow
    \wamatrixtoks{}%
    \wamatrixfirstrowfalse
  \else
    \wamatrixtoks=\expandafter{\the\expandafter\wamatrixtoks\expandafter\\}%
  \fi  
  \wamatrixfirstcoltrue
  \pgfkeys{wamatrix/warow/.list={#1}}%
}}
\newcommand\wamatrix[1]{\wamatrixfirstrowtrue
\pgfkeys{wamatrix/warows/.list={#1}}%
\begin{pmatrix}
\the\wamatrixtoks\\
\end{pmatrix}}
\begin{document}
\[
A=\wamatrix{ {{1/4, 0, 1/2, 1/4}, {0, 0, 0, 1}, {1/2, 0, 0, 1/2}, {1/4, 1/4, 0, 1/2}} }
\]

[ B=\wamatrix{ {{\frac{1}{4}, 0, 1/2, 1/4}, {0, 0, 0, 1}, {1/2, 0, 0, 1/2}, {1/4, 1/4, 0, 1/2}} } ] \end{document}

enter image description here

0

Calc is a great feature from Emacs to deal with matrix calculus. For example, if you want to type a matrix raised to the fifth power , just type in your LaTeX document :

% [calc-mode: fractions: t]
{\newcommand*\evalto{} \renewcommand*\to{=}
\[
  ((1/4)[[1  0  2  1]
       [0  0  0  4]
       [ 2  0  0  2]
       [1  1  0  2]])^5=>\]}

The preamble is necessary since fractions mode is not a default mode.

Then assuming the point (cursor) whithin the matrix code, activate calc-embedded-mode (M-x calc-embedded-mode or C-x * e). Instantanely, The calculus is proceded and display (after formatting using some Emacs features):

 % [calc-mode: fractions: t]
{  \newcommand*\evalto{} \renewcommand*\to{=}
\[
  \evalto
  \left( \frac{1}{4}
    \begin{pmatrix}
      1 & 0 & 2 & 1 \\
      0 & 0 & 0 & 4 \\
      2 & 0 & 0 & 2 \\
      1 & 1 & 0 & 2
\end{pmatrix} \right)
^5 \to
\begin{pmatrix}
 \frac{131}{512}  & \frac{125}{1024} & \frac{69}{512} & \frac{499}{1024} \\
 \frac{61}{256}   & \frac{33}{256}   & \frac{1}{8}    & \frac{65}{128}   \\
 \frac{65}{256}   & \frac{61}{512}   & \frac{33}{256} & \frac{255}{512}  \\
 \frac{255}{1024} & \frac{65}{512}   & \frac{61}{512} & \frac{517}{1024}
\end{pmatrix}     \]
   }%  

which render (you have to activate calc-embedded-mode again to return to latex-mode):

The LaTeX rendering

gigiair
  • 1,812