解决方案

Wolfram语言和Mathematica版本13的最新功能(下)

版本 13 现在所做的是在它认为没有歧义时自动添加匹配的括号。需要学习的是,您可以“输入”括号;换句话说,如果这种情况下光标正好位于自动添加的 ] 之前,您明确键入 ] 则不会出现新的 ];系统只会“输入”]。

还有一种选择是使用 ctrlspace 移动到自动添加的右括号的右侧。而且,顺便说一句,即使光标不在括号旁边,ctrlspace 也会“向右移动”下一个右括号;即使光标位于嵌套结构的深处,它也会这样做。

自动化行为(https://reference.wolfram.com/language/ref/DelimiterAutoMatching.html)(如果您真的不喜欢,可以在“首选项”对话框中将其关闭)不仅适用于 [ ],还适用于 { }, ( ), [[ ]], <| |>、(* *) 和(重要的)“”。并且 ctrlspace 也适用于所有这些类型的分隔符。

对于认真的用户体验爱好者来说,可能还有一个有趣的地方。键入 ctrlspace 可能会将光标移动得远到看不见它。当输入正在实时排版的数学和其他二维材料时,也会发生这种远程光标移动。在 1990 年代,我们发明了一种机制来避免人们“丢失光标”。在内部,我们称其为“难以置信的收缩斑点”。它是一个大的黑点,出现在光标的新位置,并在大约 160 毫秒内缩小为纯光标。将此视为“视觉黑客”。实际上我们在准备加入人类的预注意视觉系统,这会让人们自动将视线转移到“突然出现的物体”上,但实际并没有真正注意到自己已经这样做了。

在版本 13 中,我们现在不仅将这种机制用于实时排版,还用于 ctrlspace——每当“跳跃距离”超过某个阈值时添加 blob。

你甚至可能不会注意到这个黑点的存在(只有一小部分人似乎“看到”了它)。但如果时机够好,你会看到:


计算的进步

你正在运行一个很长的计算,一定想知道这期间系统都在干什么?我们有一项长期计划,旨在为尽可能多的执行长时间计算的函数提供交互式进度监控。

13.0 版本中的一个例子是ParallelMap、ParallelTable等自动为您提供进度监控:


显示是暂时的;它仅在计算运行时存在,然后消失。

这方面还有很多其他的例子,而且还会有更多。视频、机器学习、知识库访问、导入/导出和各种算法函数都有进度监控:




一般来说,进度监控是一件好事;它可以帮助您了解正在发生的事情,并允许您检查事情是否偏离了轨道。但有时它可能会令人困惑,特别是如果有一些你甚至不知道被调用的内部函数——你突然看到它的进度监控。很长一段时间以来,我们一直认为这个问题会使广泛进度监控成为一个坏主意。但是,看到正在发生的事情的价值几乎总是超过看到你不知道的“幕后”发生的事情所带来的困惑。一旦某些操作结束,它的进度监视器就会消失,因此在您的最终笔记本中没有任何迹象,这确实很有帮助。

顺便说一句,每个带有进度监控的函数都有一个 ProgressReporting 选项,您可以将其设置为 False。此外,还有一个全局变量 $ProgressReporting 指定整个系统的默认值。

值得一提的是,“做完了吗?”有不同层次的监控。某些函数会经过系统的一系列步骤,例如处理视频中的每一帧。在这种情况下,可以将“完成比例”显示为进度指示条。有时,通过“统计地”查看到目前为止部分计算中发生的情况,也可以至少对“完成比例”(以及预期的完成时间)做出一些猜测。例如,这就是 ParallelMap 如何等进行进度监控。当然,通常不可能知道任意计算需要多长时间。这就是计算不可约性以及图灵机停机问题的不可判定性的故事。但是假设(大多数情况下结果都很好)不同子计算的运行时间分布相当平滑,仍然可以给出合理的估计。(而且,是的,潜在不确定性的“明显迹象”是完成百分比可能会随着时间的推移而下降和上升。)

Wolfram|Alpha 笔记本

多年来,我们拥有 Mathematica + Wolfram Language,并且拥有 Wolfram|Alpha。然后在 2019 年底,我们推出了Wolfram|Alpha Notebook Edition,作为两者之间的一种融合。事实上,在 Mathematica 和 Wolfram|Alpha 的标准桌面和云部署中,现在还有 Wolfram|Alpha-Mode Notebook 的概念,其基本思想是您可以用自由形式的自然语言输入内容,但获得在表示和建立计算方面的 Wolfram 语言功能:


在 13.0 版中,Wolfram|Alpha-Mode Notebooks 添加了很多内容。首先,有用于直接输入 2D 数学符号的调色板:


现在还可以直接从自由格式的语言输入中立即生成丰富的动态内容:


除了“定制”互动内容,在 Wolfram|Alpha-Mode Notebooks 中,您还可以立即访问来自 Wolfram 演示项目(https://demonstrations.wolfram.com/) 中 12,000 多个演示的互动内容:


Wolfram|Alpha Notebook Edition 尤其适用于教育。在 13.0 版中,我们包含了第一个交互式测验集合,特别是关于图的:


测验所需要的一切都在语言中

13.0 版引入了在桌面和云端直接用 Wolfram 语言创建、部署和评分测验的能力。以下是已部署测验(https://www.wolframcloud.com/obj/sw-writings/Quizzes/WolframLanguageQuiz/quiz)的示例:


这是怎么做的?有一个创作笔记本(https://www.wolframcloud.com/download/sw-writings/Quizzes/WolframLanguageQuiz/authoring),看起来像这样:


这一切都基于我们在12.2版本中引入的表单笔记本功能。但是还有一个额外的元素:QuestionObject。QuestionObject 给出了要问的问题的符号表示,和 AssessmentFunction 一起应用到提供的答案、评估、评分或以其他方式处理。

在最简单的情况下,“要问的问题”只是一个字符串。但它可以更复杂,并且您可以在创作笔记本中选择一系列可能性(将稳步增长):


(构造 QuestionInterface 可让您详细控制“问题提示”的设置方式。)

一旦您在创作笔记本中创建了测验(当然它不必只是课件意义上的“测验”),您需要部署它。设置允许您设置各种选项:


然后,当您按“ Generate 时,您会立即获得测验的部署版本,例如,可以直接在 Web 上访问。您还将获得一个结果笔记本,它向您展示如何从进行测验的人那里检索结果。

那么当有人做测验时会发生什么呢?每当他们按下 Submit时,他们的答案将被评估并提交到您指定的目的地——可以是云对象、数据库等(您还可以指定您希望将本地反馈提供给进行测验的人。)

因此,在几个人提交了答案后,您得到的结果可能如下所示:


总而言之,13.0 版现在提供了用于创建简单和复杂测验的简化工作流程。测验可以涉及各种不同类型的响应——特别是包括可运行的 Wolfram 语言代码。评估也可以是复杂的——例如包括代码比较。

只是为了了解可能的情况,这里有一个要求选择颜色的问题,它将与正确答案在一定的公差范围内进行比较:


解开电子邮件、PDF等

电子邮件线程到底是什么样的?我琢磨这个已经很久了。现在在 13.0 版中,我们可以轻松导入 MBOX 文件并查看电子邮件的线程结构。以下是我们内部邮件列表中的一个示例:


现在我们可以对此进行标准图操作:

12.2 版的一个重要新功能是能够以各种形式忠实地导入 PDF,包括页面图像和纯文本。在 13.0 版中,我们添加了将 PDF作为矢量图形导入的功能。

以下是作为图像导入的页面示例:


现在这是一个作为矢量图形导入的页面:


现在,为了证明它是矢量图形,我们实际上可以进去修改它,一直到每个字形中使用的笔画:

现在我们有了Wolfram 语言的视频,我们希望能够导入尽可能多的视频。我们已经支持非常完整的视频容器和编解码器列表。在 13.0 版中,我们还添加了导入 .FLV (Flash) 视频的功能,让您有机会将它们转换为现代格式。


CloudExpression 成为主流

您有一个想要跨会话操作的表达式。一种方法是使用PersistentValue使整个表达式持久化——或者将其显式存储在文件或云对象中,并在需要时将其读回。但是有一种更有效和无缝的方法来做到这一点——它不需要你一直处理整个表达式,而是让你“戳”和“偷看”各个部分——那就是使用CloudExpression。

我们在 2016 年的10.4 版本中首次引入了CloudExpression。当时,它的目的是作为一种相当临时的方式来存储相当小的表达式。但我们发现它比我们预期的更有用,因此在 13.0 版中它进行了重大升级,使其更加高效和强大。

值得一提的是,还有其他几种方法可以在 Wolfram 语言中持久存储内容。您可以使用PersistentValue来持久化整个表达式。您可以使用Wolfram Data Drop (https://datadrop.wolframcloud.com/) 功能让您逐步添加到数据仓。您可以使用ExternalStorageUpload 将内容存储在 S3 或 IPFS 等外部存储系统中。或者您可以设置一个外部数据库(如基于 SQL 或基于文档的数据库),然后使用Wolfram 语言函数来访问和更新它.

但是 CloudExpression 提供了一种更轻量级但更通用的方式来设置和操作持久表达式。基本思想是创建一个持久存储在您的云帐户中的云表达式,然后能够对该表达式执行操作。如果云表达式由列表和关联组成,那么标准的 Wolfram 语言操作让您可以有效地读取或写入云表达式的部分内容,而无需在会话中将整个内容拉入内存。

这会从一个包含多项式的表中创建一个云表达式:


这给了我们表格的第 5 部分:

In[1]:= ce[5]

Out[1] = 1+x^5

我们可以重置它:


In[2] := ce[5]= yyyy

Out[2] = yyyy

这得到了整个云表达式:


但重要的一点是,获取和设置部分云表达式不需要将表达式拉入内存。相反,每个操作都直接在云中完成。

在传统的关系数据库系统中,数据必须具有一定的“矩形性”。但是在云表达式中(例如在 NoSQL 数据库中),您可以有任何嵌套列表和关联结构,此外,元素可以是任意符号表达式。

CloudExpression的设置使您使用的操作是原子的,例如,您可以安全地让两个不同的进程同时读取和写入同一个云表达式。结果是CloudExpression 是处理由APIFunction 和 FormFunction等构建的数据的好方法。

顺便说一句,CloudExpression 最终实际上只是一个云对象,因此它与CloudObject 共享权限功能。这意味着,例如,您可以让其他人读取或写入您创建的云表达式。(与CloudExpression关联的数据存储在您的云帐户中,尽管它使用自己的存储配额,与CloudObject的配额不同。)

假设您将大量重要数据作为子列表存储在CloudExpression中。CloudExpression非常易于使用,您可能会担心只输入ce["customers"]=7 之类的内容,然后您的关键数据会突然被覆盖。为避免这种情况,CloudExpression 提供了PartProtection选项,它允许您指定,例如,您是要允许更改表达式的结构,还是只允许更改其“叶元素”。

函数存储库的进展

当我们在 2019 年推出Wolfram 函数存储库时,我们并不知道它会以多快的速度增长。但我很高兴地说,它取得了巨大的成功——每天可能发布 3 个新函数,迄今为止总共有 2259 个函数。这些函数不是核心Wolfram 语言的一部分,但可以立即从任何 Wolfram 语言系统访问.

它们是由社区成员贡献的功能,由我们审查和策选。考虑到核心 Wolfram 语言的所有功能,在单个贡献函数中可以实现的效果是非常了不起的。这些函数大多不具备集成到核心 Wolfram 语言所需的全部广度和鲁棒性(尽管版本 13.0 中的Adjugate等函数是从函数库中的“原型”开发的),但他们所拥有的是一个大大加速的交付过程,这使得新领域中的便利新功能能够非常迅速地可用。

函数存储库中的一些函数扩展了算法能力。一个例子是用于计算分数导数的FractionalOrderD :


FractionalOrderD 中有很多内容。但它在某种程度上是非常具体的——从某种意义上说,它基于一种特定类型的分数微分。将来我们可能会在系统中构建全尺度分数微分,但这需要大量新算法。Function Repository 中的 FractionalOrderD 所做的是现在只提供一种形式的分数微分。

这是函数存储库中函数的另一个示例,这次是基于Wolfram|Alpha中的功能:



某些功能提供扩展的可视化功能。这是维恩图:



作为可视化函数的另一个示例,这里是TruthTable — 用于直观显示核心语言BooleanTable 函数的结果:


一些函数为语言的特定特性提供了方便的(尽管可能不完全是通用的)扩展。这是IntegerChop 将“足够接近整数”的实数化简为精确整数:

In[=]:= ResourceFunction["IntegerChop"][7.00000000000000000000000001]

Out[=]:= 7

这是一个函数的示例,也许有一天它会在核心语言中。但目前最常见的情况是由 Function Repository 函数提供的:

In[=]:= ResourceFunction["PolarDecomposition"][{{2.5,4.5},{5.6,1.2}}]

Out[=]:= {{{0.12766, 0.991818}, {0.991818, -0.12766}}, {{5.87333, 1.76465}, {1.76465, 4.30999}}}

Function Repository 中有很多函数,它们为核心语言的功能领域提供了特定的扩展。例如, BootstrappedEstimate为统计功能提供了一个有用的特定扩展:


这是一个“重新映射”曼德尔布罗集的函数 —— 使用 FunctionCompile 比MandelbrotSetPlot 更进一步:


有一些功能看起来绝对是“小众”——但如果你需要它们,它们会非常有用:


还有一些功能使“当前问题”变得方便。一个例子是MintNFT:


还有“有趣的功能”(肯定也很有用):


还有一些功能可能被认为是“内幕”幽默:


顺便说一句,不仅仅是函数库一直在成长,做出了各种巨大的贡献:还有数据库 (https://datarepository.wolframcloud.com/) 和神经网络库 (https://resources.wolframcloud.com/NeuralNetRepository/),它们也在大力推进。

介绍创建程序包的工具

函数存储库是关于创建添加功能的单个函数。但是,如果您想创建一个具有许多相互关联的函数的全新功能世界怎么办?也许它不仅涉及函数,还涉及例如对用户界面元素的更改。多年来,我们使用我们称之为 paclet 的技术在内部构建了Wolfram 语言系统的许多部分——它有效地提供了可以自动安装在任何给定用户系统上的功能包。

在12.1 版本中我们开放了 paclet 系统,提供了PacletFind 和PacletInstall 等特定功能来使用 paclet。但是创建 paclet 仍然是一门黑魔法。在 13.0 版中,我们现在发布了第一轮工具来创建 paclet (https://reference.wolfram.com/language/PacletTools/guide/PacletTools.html),并允许您将它们部署为文件或通过 Wolfram Cloud (https://www.wolfram.com/cloud/index.php.zh) 分发。

以程序包形式分发的程序包工具,现在默认包含在每个 Wolfram 语言安装程序中. 目前,这些工具位于一个单独的包中,您必须加载:

Needs["PacletTools`"]

要开始创建 paclet,您需要定义一个“paclet 文件夹”,其中包含构成您的 paclet 的所有文件:


这将设置您的 paclet 的基本大纲结构,然后您可以添加文件:


这将设置您的 paclet 的基本大纲结构,然后您可以添加文件:


paclet 中可以存在各种各样的元素,在未来的版本中,将会有更多的工具使创建它们变得更加容易。然而,在 13.0 版中,交付的一个主要工具是文档工具 (https://reference.wolfram.com/language/DocumentationTools/tutorial/DocumentationToolsQuickStart.html),它提供了用于创建与内置系统功能相同类型的文档的工具。

您可以直接从主系统调色板 (Palettes) 菜单访问这些工具:


现在,您可以在您的程序包函数参考页面、指南页面、技术说明和其他文档元素中创建笔记本。一旦你有了这些,你就可以使用PacletDocumentationBuild将它们构建到完成的文档中。然后,您可以将它们作为笔记本文件、独立的 HTML 文件或部署在云中的材料。

即将推出用于创建程序包的其他工具,以及用于用户贡献数据包的公共程序包存储库。支持 Paclet 存储库的一个重要特性——已经可以与私有部署的 paclet 一起使用——是新函数 PacletSymbol。

对于函数存储库,您可以使用 ResourceFunction["name"] 访问存储库中的任何函数。PacletSymbol 是程序包的类似物。使用程序包的一种方法是显式加载其所有资产。但是 PacletSymbol 允许您“深度调用”到一个 paclet 以访问单个函数或符号。就像ResourceFunction 一样,在幕后仍然会发生各种资产加载,但是在您的代码中,您可以只使用 PacletSymbol 而无需任何可见的初始化。顺便说一下,一种新兴的模式是用一个程序包“支持”一组相互依赖的函数存储库函数,使用PacletSymbol 从函数存储库中的代码访问各个函数。

上下文别名介绍

当您为某事使用名称(例如x)时,总是会出现“哪个x?”的问题。从版本 1.0 开始,每个符号都有上下文的概念。默认情况下,您在Global上下文中创建符号,因此您创建的x的全名是Global`x。

创建程序包时,您通常希望对其进行设置,以便它们引入的名称不会干扰您正在使用的其他名称。为了实现这一点,通常让程序包定义自己的上下文。然后,您始终可以通过其全名引用程序包中的符号,例如Package`Subpackage`x等。

但是,当您只要求x时,您会得到什么?这是由$Context和$ContextPath的设置定义的。

但有时你想要一个中间案例。如果Package`在上下文路径$ContextPath上,您希望能够在“在其程序包中”引用 x ,而不需要输入(或必须查看)潜在的长程序包的名称。

在 13.0 版中,我们引入了上下文别名的概念来让您这样做。基本思想非常简单。当您执行 Needs["Context`"] 加载定义特定上下文的程序包时,您可以通过执行 Needs ["Context`"->"alias`"] 添加“上下文别名” 。这样做的结果是,您可以将该上下文中的任何符号称为 alias`name。如果您没有指定上下文别名,Needs 会将您要求的上下文添加到 $ContextPath,因此其符号是“只有 x“ 形式。但是,如果您正在使用许多不同的上下文,这些上下文可能包含名称重叠的符号,那么为每个上下文使用上下文别名是一个更好的主意。如果您定义短别名,则不会有更多的输入,但您将确保始终引用正确的符号。

这会加载与上下文 ComputerArithmetic` 对应的包,默认情况下将该上下文添加到 $ContextPath:

Needs["ComputerArithmetic`"]

现在可以使用具有ComputerArithmetic的符号而无需说明其上下文:


这将加载为其定义上下文别名的包:

Needs["ComputerArithmetic`"->"ca`"]

现在您可以使用别名来引用它的符号:


全局符号$ContextAliases指定您当前使用的所有别名:


顺便说一句,就像我们关于名称以大写字母开头的符号的约定一样,程序包的上下文名称也以大写字母开头是一种常见的通用约定。现在我们也有上下文别名,我们建议使用小写字母的约定。

符号网页构建

如果你想把一个笔记本变成一个网页,你需要做的就是 CloudPublish。同样,如果您想在 Web 上创建表单,您可以将 CloudPublish 与 FormFunction(或FormPage)一起使用。此外, Wolfram 语言中还内置了多种其他直接写 Web 的功能。

但是,如果您想制作一个包含精致 Web 元素的网页怎么办?一种方法是使用XMLTemplate 将 Wolfram 语言输出插入 HTML 等文件。但在 13.0 版中,我们开始设置完整网页结构的符号规范,让您充分利用 Wolfram 语言和 web 能力及框架。

这是一个非常小的例子:


这是它产生的网页:


基本思想是使用WebColumn、WebRow和WebItem的嵌套组合来构建网页。每一个都有不同的 Wolfram 语言选项。但它们也允许直接访问 CSS 选项。因此,除了 Wolfram 语言背景-> LightBlue选项之外,您还可以使用 CSS 选项,例如"border-right"->"1px solid #ddd"。

还有一个额外的关键特性:InterfaceSwitched。这是能够创建响应式网页的核心,这些网页在不同类型的设备上查看时可以改变其结构。InterfaceSwitched 是一个符号结构,您可以在 WebItem、WebColumn 等内部的任何位置插入它,并且在使用不同的界面访问时会表现出不同的行为。所以,例如

InterfaceSwitched["Width", <|{0,480}->1, {480,768}->2,{768,Infinity}->3|>]

如果从宽度在 0 到 480 像素之间的设备访问它,它将表现为 1,依此类推。您可以使用CloudPublish 看到这一点


然后只需调整用于查看结果的窗口的大小:


现在聊聊 NFT!

自12.3 版发布以来,世界上发生的一件事就是 NFT 理念的主流化。实际上,多年来我们已经有工具来支持区块链上的 NFT 以及一般的代币。但在 13.0 版本中,我们添加了更

精简的 NFT 工具,特别是在我们连接到 Cardano 区块链的背景下。

NFT(“不可替代代币”)的基本思想是拥有一个可以在用户之间转移但不能复制的独特代币。它就像一枚硬币,但每个 NFT 都可以是独一无二的。区块链提供了谁拥有什么 NFT 的永久分类帐。当你转移 NFT 时,你所做的只是在区块链中添加一些东西来记录该交易。

NFT 可以用来做什么?很多事情。例如,我们为今年从我们的暑期学校和夏令营“毕业”的人颁发了“NFT 证书” 。我们还发布了 NFT 来记录我们在直播中创建的一些元胞自动机艺术品的所有权。一般来说,NFT 可以用作任何事物的永久记录:所有权、凭证或只是对成就或事件的纪念。

在典型情况下,直接在区块链上运行的 NFT 有一个小的“有效负载”。如果有更大的资产(如图像),它们将存储在一些分布式存储系统(如 IPFS)上,并且区块链上的有效负载将包含指向它们的指针。

这是一个示例,它使用我们的几个区块链功能——以及与 Cardano 区块链的新连接——从 IPFS 检索与我们几周前铸造的 NFT 相关联的图像:


你怎么能自己铸造这样的 NFT 呢?Wolfram 语言有执行此操作的工具。Wolfram 函数库中的 ResourceFunction["MintNFT"] 提供了一种通用的工作流程(专门针对 CIP 25 Cardano NFT 标准)——而且还会有更多。

低于“纯消费者”层面的区块链的完整故事是复杂和技术性的。但是 Wolfram 语言提供了一种独特的简化方式来处理它,基于区块链结构的符号表示,可以使用 Wolfram 语言的所有标准函数直接操作。还有许多不同的区块链,具有不同的设置。但是通过我们在过去几年中所做的大量努力,我们已经能够创建一个统一的框架,在不同的区块链之间进行互操作,同时仍然允许访问它们的所有特殊功能。因此,现在您只需设置不同的BlockchainBase(比特币、以太坊、Cardano、Tezos、ARK、Bloxberg 等),就可以与不同的区块链进行交互了。

更时尚、更快地下载

我在这里谈到的所有内容今天都可以立即在 Wolfram Cloud 和桌面上使用——适用于 macOS、Windows 和 Linux(对于 macOS,英特尔和“Apple Silicon” ARM 均适用)。但是当你去下载时(至少对于 macOS 和 Windows)有一个新的选择:下载没有本地文档。

Wolfram Desktop 或 Mathematica的实际可执行包对于 Windows 大约为 1.6 GB,对于 macOS 大约为 2.1 GB(对于 macOS 更大,因为它包含涵盖 Intel 和 ARM 的“通用”二进制文件)。但是还有文档。而且还有很多。如果您全部下载,则需要另外下载 4.5 GB,部署到系统上时需要 7.7 GB。

所有这些文档存在的意义是非常重要的,我们为它的广度和深度感到自豪。将这些文档直接保存在您的计算机上绝对很方便——作为笔记本,您可以立即调出并根据需要进行编辑。但是随着我们的文档变得越来越大(我们正在努力让它变得更大),更好的优化是节省计算机上的本地空间,从网络上获取文档。

因此,在 13.0 版中,我们引入了无文档下载——你只需访问网络并在您的浏览器中显示文档。当你第一次安装 Mathematica 或 Wolfram|One 时,可以选择“完整包”,包括本地文档。或者可以选择只安装可执行包,而不安装文档。如果您稍后改变主意,您始终可以使用“帮助”菜单中的“安装本地文档”项下载并安装文档。