![将 WolframAlpha 的矩阵解析为 LaTeX](https://linux22.com/image/441268/%E5%B0%86%20WolframAlpha%20%E7%9A%84%E7%9F%A9%E9%98%B5%E8%A7%A3%E6%9E%90%E4%B8%BA%20LaTeX.png)
我有同样的问题这个问题,但相反。
我经常需要在 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}%
\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}