将 WolframAlpha 的矩阵解析为 LaTeX

将 WolframAlpha 的矩阵解析为 LaTeX

我有同样的问题这个问题,但相反。

我经常需要在 LaTeX 中写出一个矩阵,该矩阵是某种计算的结果。当然,计算本身通常最容易在 WolframAlpha 或其他类似软件中执行。

例如,考虑矩阵的平方运算这里。我还想要这个矩阵的三次方、四次方和五次方。

用 LaTeX 写这个非常耗时且麻烦。不过 WolframAlpha 确实为答案提供了一种格式:“可复制纯文本”选项和“Wolfram 语言纯文本输出:”

在此处输入图片描述

如果我能以某种方式将这两个输出中的任何一个转换为结果矩阵,则

   \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}

这会减少相当多(在我看来)不必要的工作。

也就是说,我假设喜欢一些宏,\wamatrix比如使用

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

或者

 \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}} }

会得到与使用相同的结果

   \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}

(当然,矩阵不一定是这个特定的矩阵,理想情况下甚至不一定是相同大小的矩阵。)

我不知道这有多可行,但如果有人能提供帮助,我将不胜感激!

答案1

这可能不是最简单的方法,但您可以使用该xstring包对代码进行一些重新格式化:

\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}

在此处输入图片描述

请注意,xstring默认情况下,宏仅处理字符串中下一个分组级别的字符。例如,\StrSubstitute{aaa{a}a}{a}{b}将导致bbb{a}b(而括号不会打印在输出中)。同样,\StrRemoveBraces默认情况下只删除最外面的一对括号。此行为在这里用于首先将字符串(方便地包含括号以对项目进行分组)拆分为行,然后拆分为单元格。

答案2

在这里,我用一个标记循环来消化矩阵,并用 TAB 堆栈对其进行排版。标记循环会回显除逗号之外的输入标记。对于逗号,它们将被替换为 a&或 a \\,具体取决于输入中的分组深度。TAB 堆栈会排版此修订后的标记流。

注意,行间距和列间距是可设置的参数。

\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}

在此处输入图片描述

如果有人真的想\wamatrix通过 OP 展示的额外括号进入通话,

\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}} }

那么只需要将\tcdepth检查从更改<1为即可<2\Characterdirective

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

答案3

附加// TeXForm到您的 WolframAlpha 查询。然后在“精确结果”面板下,单击“纯文本”并复制。在此处尝试您的示例。

TeXForm是 Wolfram 语言的内置函数,是 WolframAlpha 和 Mathematica 的基础。

答案4

不确定这是否简单或与其他答案有本质上的不同,但也可以使用 pgf 循环嵌套列表并构建矩阵内容。请注意,这不会明确使用全局宏,并且如果某些条目是“不可扩展”的宏,也会起作用。

\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}

在此处输入图片描述

相关内容