查看所有发布公告»

launch Version 12.2 of Wolfram Language & Mathematica: 228 New Functions and Much More…

但比以往任何时候都要大

当我们释放版本12.1今年3月,我很高兴能够用它的182项新功能这是我们有史以来最大的一次发布。1。但仅仅9个月后,我们就有了一个更大的。1版本!今天发布的版本12.2,拥有228项全新功能

launch Version 12.2 of Wolfram Language & Mathematica: 228 New Functions and Much More…

我们总是有一系列的开发项目在进行,任何一个项目都需要几个月到十几年的时间才能完成。当然,这是对我们整个Wolfram语言我们能够如此迅速地开发如此多的技术。但是版本12.2更令人印象深刻的是,我们直到今年6月中旬才开始关注它的最终开发。因为在3月和6月之间,我们专注于12.1.1,这是一个“抛光释放”。没有新的功能,但超过一千个优秀的错误修复了:


12.2版本中修复了一千多个bug,点击放大

我们是怎么设计的新功能和新特性现在在12.2?工作量太大了!这也是我个人花费了大量时间的事情(以及其他一些事情)。小物品“就像物理等)。但是在过去的几年里,我们以一种非常开放的方式进行了语言设计直播我们的内部设计讨论,并实时获得各种各样的反馈。到目前为止,我们已经记录了大约550小时的版本12.2占用了至少150小时。

活的首席执行官

顺便说一下,除了所有在12.2中完全集成了新功能,还有很大的活动Wolfram函数库-甚至自12.1发布以来,534个新的、针对各种特殊目的的策划功能也被添加进来。

生物分子序列:符号DNA、蛋白质等。

版本12.2中有许多不同的内容,涉及许多领域,很难知道从哪里开始。但让我们来谈谈一个全新的领域:生物序列计算.是的,我们有基因和蛋白质数据在Wolfram语言中使用了十多年。但12.2的新内容是开始使用生物序列进行灵活的、一般的计算。并以一种符合所有化学计算能力我们已经在过去的几年里加入了Wolfram语言

这是我们如何表示DNA序列(是的,这也适用于非常长的序列):

BioSequence
& # 10005

BioSequence(“DNA”,“CTTTTCGAGATCTCGGCGTCA”)

将序列转化为肽(就像“象征性核糖体”):

BioSequenceTranslate
& # 10005

BioSequenceTranslate (%)

现在我们可以找出相应的分子是什么

分子
& # 10005

分子(%)

在3D中可视化(或计算大量属性):

分子绘图仪3D
& # 10005

MoleculePlot3D (%)

我不得不说,我对将“我们的”生物特性添加到核心语言中的“非普遍性”感到有些苦恼,但这确实动摇了我的想法,当然,我们所有的用户(目前)都是如此真核生物.不过不用说,我们已经准备好应付还有其他的生命分支

实体
& # 10005

实体(“GeneticTranslationTable”、“AscidianMitochondrial”)(“StartCodons”)

你可能会认为处理基因组序列是“字符串操纵”——事实上我们的字符串函数现在已设置为与生物序列

StringReverse
& # 10005

StringReverse [BioSequence[“DNA”,“CTTTTCGAGATCTCGGCGTCA”]]

但也有很多生物特有的附加功能。像这样找到互补的基对序列

生物测序完成
& # 10005

BioSequenceComplement [BioSequence[“DNA”,“CTTTTCGAGATCTCGGCGTCA”]]

实际上,实验序列通常有一些不确定的碱基对,有标准的惯例来表示(例如,“S”表示C或g;“N”表示任何碱基)我们的字符串模式也了解这样的事情生物序列:

StringMatchQ
& # 10005

StringMatchQ [BioSequence(“DNA”,“CTTT”),“STTT”)

还有一些新功能,比如BiosequenceInstances.用于解决堕落字符:

BiosequenceInstances.
& # 10005

BiosequenceStances [Biosequence [“DNA”,“STTT”]]

BioSequence也完全与我们的内置的基因组和蛋白质数据.这是一个我们可以用自然语言要求的基因"Wolfram | Alpha风格”:

BioSequence
& # 10005

Biosequence [CloudGet [“https://wolfr.am/rowvgtnr”]]

现在我们要求做什么序列比对在这两个基因之间(在这种情况下,人类 - 这是不用说,默认值):

BioSequence
& # 10005


            

12.2节的内容只是我们计划的生物序列计算的开始。但是你已经可以用大数据集做非常灵活的事情了。例如,现在我可以直接读取我的基因组Fasta文件开始探索吧……

BioSequence
& # 10005

生物序列[“DNA”,第一个[导入[“Genome/Consensus/c1.fa.Consensus.fa”]]

空间统计与建模

鸟巢的位置,金矿床,待售房屋,材料中的缺陷,星系......这些都是例子空间点数据集.在版本12.2中,我们现在有一个广泛的功能集合用于处理此类数据集。

这是你的名字“空间点数据“有关我们国家的首都

SpatialPointData
& # 10005

SpatialPointData [GeoPosition [EntityClass[“城市”、“UnitedStatesCapitals”]]]

既然是地理数据,它被标在地图上:

PointValuePlot
& # 10005

PointValuePlot[%]

让我们将我们的域限制在相邻的美国:

大写=空间点数据
& # 10005

capitals = SpatialPointData[GeoPosition[EntityClass["City", "UnitedStatesCapitals"]], Entity["Country", "UnitedStates"]];

PointValuePlot
& # 10005

PointValuePlot[%]

现在我们可以开始计算空间统计了。喜欢这里的平均密度州首府:

意思是delpity
& # 10005

MeanPointDensity(首都)

假设你处于州首都。这是有可能在一定距离之外找到最近的其他州首府

NearestNeighborG
& # 10005

NearestNeighborG(首都)

情节
& # 10005

图[%[数量[r,“英里”]],{r, 0,400}]

测试各州首府是否随机分布;不用说,它们不是:

SpatialRandomnessTest
& # 10005

空间随机性测试[大写]

除了从空间数据计算统计信息外,版本12.2还可以根据广泛的型号.这是一个随机选择“中心点”的模型,然后还有其他点聚集在他们周围吗

PointValuePlot
& # 10005

PointValuePlot [RandomPointConfiguration [MaternPointProcess[。0001年,1。1 2],CloudGet [" https://wolfr.am/ROWwlIqR "]]]

你也可以反过来使空间模型适合于数据

EstimatedPointProcess
& # 10005

EstimatedPointProcess[大写,MaternPointProcess[\[Mu], \[Lambda], r, 2], {\[Mu], \[Lambda], r}]

方便现实世界PDES

在某种程度上,我们一直致力于30年。我们首先介绍了NDSolve早在版本2.0,我们已经从那以后,它一直在稳步增强但我们的长期目标始终是方便处理在高端工程中出现的那种真实世界的PDE。在12.2版中,我们最终获得了所有底层算法技术,能够创建真正精简的PDE解决体验

那么如何指定PDE呢?在过去,它总是明确地用特殊的导数,边界条件,等等。但大多数工程中使用的偏微分方程是由更高层次的成分组成的,这些成分“打包”了导数、边界条件等来表示物理、材料等的特征。

我们的新PDE框架的最低层由符号“术语”组成,与现实PDE中出现的常见数学结构相对应。例如,这是一个2D”拉普拉斯算子的术语”:

Laplacianpdeterm.
& # 10005

laplacianpdeterm [{u [x,y],{x,y}}]

现在这一切都是为了找到前5个特征值正多边形中的拉普拉斯函数:

NDEigenvalues
& # 10005

ndeigenvalues [laplacianpdeterm [{u [x,y],{x,y}}],u [x,y],{x,y} \ [元素] rangalPolygon [5],5]

重要的是,你可以把这种操作放到整个管道中。就像我们从图像中获取区域求第十本征模, 进而三维绘图结果

NDEigensystem
& # 10005

NDEigensystem[{LaplacianPDETerm[{u[x, y], {x, y}}}, u[x, y], {x, y} \[Element] ImageMesh[CloudGet["https://wolfr。am / ROWwBtE7“]],10][[2 1]]

Plot3D
& # 10005

Plot3D[%,{x,y}\[Element]图像网格[CloudGet[”https://wolfr.am/ROWwGqjg"]]]

除了Laplacianpdeterm.,有一些东西DiffusionPDETerm对流术表示实际pde中出现的其他术语。这里有个术语单位扩散系数的各向同性扩散

DiffusionPDETerm
& # 10005

diffusionpdet [{\[Phi][x, y, z], {x, y, z}}]

除了单个术语外,还有组合多个术语的“组件”,通常带有各种参数亥姆霍兹偏微分方程元件

HelmholtzPd元件
& # 10005

HelmholtzPDEComponent[{u[x,y],{x,y},<|“HelmholtzDecomponent特征值”->k}]

顺便说一下,值得指出的是,我们的“术语”和“组件”是用来表示pde的符号结构的,其形式适用于结构操作和数值分析等。为了确保它们的结构,它们通常以灭活的形式保存。但你总是可以启用如果你想做代数运算之类的事情:

激活
& # 10005

启用[%]

在现实世界的偏微分方程中,人们经常要处理发生在实际物理材料中的实际物理过程。在版本12.2中,我们有了直接的方法,不仅可以处理像这样的事情扩散,但也与声学传热大众运输- 以饲料在实际材料的性质中。通常,该结构是存在代表材料的堆积行为的PDE“部件”,以及代表边界条件的各种PDE“值”或“条件”。

这是一个典型的PDE组件,使用材料属性Wolfram知识库

HeatTransferPDEComponent
& # 10005

heattransferpdecomcomponent [{\[CapitalTheta][t, x, y], t, {x, y}}, <| "Material" -> CloudGet["https://wolfr.am/ROWwUQai"]|>]

可能的边界条件有相当多的多样性和复杂性。例如,对于热传递,有HeatFluxValueHeatInsulationValue其他五种符号边界条件规范构造.在每种情况下,基本思想都是说明条件(几何上)适用于何处,然后说明它适用于什么,以及与之相关的参数。

例如,这里有一个条件,指定有一个固定的“表面温度”θ0在(循环)区域之外的各地x2+y2= 1:

HeatTemperatureCondition
& # 10005

条件[x^2 + y^2 > 1, {\[CapitalTheta][t, x, y], t, {x, y}}, <| "SurfaceTemperature" ->下标[\[Theta], 0]|>]

这里基本上发生的是,我们的高级“物理”描述被“编译”成明确的“数学”PDE结构,如狄利克雷边界条件

好的,所以这一切如何在现实生活中融合在一起?让我展示一个例子。但首先,让我讲故事。在2009年回来我正在喝茶,我们的铅PDE开发商。我拿起了一茶匙,问道:“我们什么时候能够在此模仿压力?”我们的铅开发人员解释说,建立一点以达到这一点。好吧,我很高兴地说,经过11年的工作,在12.2版中我们在那里。为了证明它,我们的铅开发商只是给了我......(计算)勺子!

勺子=云
& # 10005

勺= cloudget [“https://wolfr.am/rowx6wkf”];

计算的核心是3D扩散PDE术语,其“扩散系数”由参数化的第4阶张量给出杨氏模量(这里Y) 和泊松比ν):

pdeterm = DiffusionPDETerm
& # 10005

pdeterm = DiffusionPDETerm [{{u (x, y, z), v (x, y, z), w [x, y, z]}, {x, y, z}}, y /(1 + \[怒 ]) { {{ {( 1 - \[怒])/(1 - 2 \[怒]),0,0},{0,1/2,0},{0,0,1/2}},{{0,\[怒]/[1 - 2 \[怒]),0},{1/2,0,0},{0,0,0}},{{0,0,\[怒]/[1 - 2 \[怒])},{0,0,0},{1/2,0,0 } }}, {{ { 0, 1/2, 0},{\[怒]/[1 - 2 \[怒]),0,0},{0,0,0}},{{1/2,0,0},{0,(1 - \[怒])/(1 - 2 \[怒]),0},{0,0,1/2}},{{0,0,0},{0,0,\[怒]/[1 - 2 \[怒])},{0,1/2,0 } }}, {{ { 0, 0, 1/2},{0, 0, 0},{\[怒]/[1 - 2 \[怒]),0,0}},{{0,0,0},{0,0,1/2},{0,\[怒]/[1 - 2 \[怒]),0}},{{1/2,0,0},{0,1/2,0},{0,0,(1 - \[怒])/(1 - 2 \[怒 ])} }} }, <| Y - > 10 ^ 9日\[怒]- > 33/100 | >);

有边界条件来指定如何握住和推勺子。然后解偏微分方程(只需要几秒钟)给出了勺子的位移场

dfield = NDSolveValue
& # 10005

dfield = deformations = NDSolveValue[{pdet == {0, NeumannValue[-1000, x <= -100], 0}, DirichletCondition[{u[x, y, z] == 0. dfield = deformations = NDSolveValue[{pdet == {0, NeumannValue[-1000, x <= -100], 0}, DirichletCondition[{u[x, y, z] == 0。, v[x, y, z] == 0。, w[x, y, z] == 0。x > = 100]}}, {u, v, w}, {x, y, z} \[元素]勺子];

然后我们可以用它来发现勺子是如何变形的:

显示
& # 10005

显示[MeshRegion[Table[Apply[if, m], {m, MeshCoordinates[spoon]}, {if, deformation}] + MeshCoordinates[spoon], MeshCells[spoon, MeshCells[spoon, {2, All}]]], Graphics3D[Style[spoon, LightGray]]]

PDE建模是一个复杂的领域,我认为这是一个主要的成就,因为我们现在已经设法将它“打包”成这样干净。但是在版本12.2中,除了PDE建模的实际技术之外,还有一些重要的内容是关于PDE建模的大量计算论文集-共约400页的详细说明和应用实例,目前在声学传热大众运输,但还有许多其他领域即将问世。

类型TEX

Wolfram语言是关于用精确的计算语言表达自己.但在笔记本中,你也可以用自然语言用普通的文本表达自己。但是如果你也想在里面显示数学呢?25年来,我们有基础设施来做数学展示通过我们的盒子的语言但是进入数学的唯一方便的方法是通过Wolfram语言进行数学构造,在某种意义上,数学构造必须具有计算意义。

但是“数学”是人类眼睛的“数学”呢?这具有您要指定的某种视觉布局,但这并不一定具有已定义的任何特定的基础计算含义?好吧,多十年来,指定这种数学的好方法,感谢我的朋友高德纳:刚使用TEX.在12.2版中,我们现在支持直接输入TEX的数学成Wolfram笔记本无论是在桌面还是在云中。下面,TEX正被转换成我们的方框表示,因此它在结构上可以与其他任何东西进行互操作EX。

界面非常像+界面Wolfram | Alpha-风格自然语言输入.但对于TEX(表示对标准T的认可EX分隔符),它是+

类型+得到一个TEX输入框。当你完成了TEx,刚击中它将被渲染:

特克斯

+,如果您单击呈现的表单,它将返回文本,您可以再次编辑,就像TEX。

进入TE文本细胞中的X是最常见的东西。但版本12.2也支持输入TE输入单元中的X:

TeX打字

如果你+评估?您的输入将被视为传统形式,并至少试图解释它。当然,如果你写的是“没有计算意义的数学”,那是行不通的。

画任何东西

类型帆布[]你会得到一张空白的画布来画任何你想画的东西:

画布[]
& # 10005

画布[]

我们努力使绘图工具尽可能符合人体工程学。

画布[]
帆布

应用正常的给你的图形,你可以使用或操作:

正常的
& # 10005

GraphicsGrid[Partition[Table[Rasterize[Rotate[Normal[%], \[Theta]], ImageSize -> 50], {\[Theta], 0,2 Pi, .4}], UpTo[8]], ImageSize -> 500]

GraphicsGrid
& # 10005

GraphicsGrid[Partition[Table[Rasterize[Rotate[Normal[%], \[Theta]], ImageSize -> 50], {\[Theta], 0,2 Pi, .4}], UpTo[8]], ImageSize -> 500]

当你创建一个画布时,它可以有任何图形作为初始内容,也可以有任何你想要的背景:

帆布
& # 10005

画布(图形[[磁盘[],透明度[风格。4,红色],EdgeForm[{Thick, Red}]]],背景->地理学[Entity["MannedSpaceMission", "Apollo16"][EntityProperty["MannedSpaceMission", "LandingPosition"]]]]

关于绘制任何东西,版本12.2有另一个新函数:molemuldraw.,用于绘制(或编辑)分子。从分子的符号表示开始:

咖啡因分子
& # 10005

分子(实体(“化学”、“咖啡因”))

现在使用molemuldraw.打开交互式分子绘图环境,进行编辑,并返回结果:

molemuldraw.

现在它是另一个分子:

新分子

永无止境的数学故事

数学已经成为Wolfram语言的核心用例Mathematica) 从一开始。并且在一个世纪的过去三分之一是非常令人满意的,看看我们能够做出计算的数学。但我们所做的越多,我们就越是实现,而且我们可以进一步走。这是我们的感觉常规。有一些数学领域,人们一直在做手或零碎的。我们弄清楚:是的,我们可以为此进行算法!我们可以使用这些年来系统地建造的巨大的能力塔,以系统化和自动化但更多的数学;为任何人提供更多数学计算方式。所以它已经使用了12.2版。整个集合的“数学进步”。

让我们从一些老生常谈的东西开始:特殊函数。从某种意义上说,每个特殊函数都是某个数学核心的封装:一种为特定类型的数学问题或系统定义计算和性质的方法。从Mathematica 1.0我们的特殊功能实现了良好的覆盖,并稳步扩展到越来越复杂的功能。在版本12.2中,我们有另一类函数:Lamé函数。

的功能是处理椭球坐标的复杂世界的一部分;它们出现在椭球上,是拉普拉斯方程的解。现在我们可以计算它们,扩展它们,变换它们,以及做所有其他的事情,这些事情涉及到将一个函数集成到我们的语言中:

情节
& # 10005

情节(Abs(詹姆斯那里(3/2 + I 3 z, 0.1 + 0.1我]],{z, 8 EllipticK (1/3), 8 EllipticK (1/3)})

系列
& # 10005

序列[LameC[\[Nu], j, z, m], {z, 0,3}]

在版本12.2中,我们也做了很多椭圆函数——极大地加快了他们的数值计算速度,并发明了能在任意精度下高效完成这一工作的算法。我们还引入了一些新的椭圆函数,比如JacobiEpsilon-提供了一个概括EllipticE避免了分支切割,保持了椭圆积分的解析结构:

ComplexPlot3D
& # 10005

compexplot3d [JacobiEpsilon[z, 1/2], {z, 6}]

我们已经做了很多象征性的事情拉普拉斯拉普拉斯逆变换几十年。但在版本12.2中,我们已经解决了使用轮廓集成来做反向拉普拉斯变换的微妙问题。这是一个了解足够的关于复杂飞机功能结构的故事,以避免分支切割和其他令人讨厌的奇点。典型的结果有效地涵盖了无限数量的杆子:

InverseLaplaceTransform
& # 10005

Inverselaplacetransform [coth [s \ [pi] / 2] /(1 + s ^ 2),s,t]

在轮廓集成和其他方法之间,我们还添加了数字逆拉普拉斯变换。这一切都很容易到底,但是有很多复杂的算法工作需要实现这一目标:

InverseLaplaceTransform
& # 10005

InverseLaplaceTransform[1/(s + Sqrt[s] + 1), s, 1.5]

另一种新算法通过更精细的“函数理解”而成为可能积分的渐近展开.这是一个复杂的函数,随着λ增加:

表格
& # 10005

表[ReImPlot [(t ^ 10 + 3)实验[我\[λ](t ^ 5 + t + 1)), {t 2 2}),{\(λ)、10、30、10}]

这是渐近展开式λ

AsymptoticIntegrate
& # 10005

渐近积分[(t^10 + 3) Exp[I \[Lambda] (t^5 + t + 1)], {t, - 2,2}, {\[Lambda],∞,2}]

告诉我那个函数

这是一个很常见的微积分练习来确定,比如说,一个特定的函数是否是单射的。在简单的情况下很简单。但是版本12.2的一大进步是我们现在可以系统地计算出这些类型函数的整体性质-不仅在简单的情况下,而且在非常困难的情况下。通常有一个完整的定理网络,它依赖于具有这样或那样性质的函数。好了,现在我们可以自动确定一个特定的函数是否具有这个性质,以及定理是否对它成立。这意味着我们可以创建系统的算法,在定理适用时自动使用它们。

这是一个例子。是棕褐色[x]内射吗?在全球范围内:

FunctionInjective
& # 10005

FunctionInjective (Tan [x], x)

但在一段时间内,是的:

FunctionInjective
& # 10005

函数单射[{Tan[x], 0 < x < Pi/2}, x]

那么奇点呢棕褐色[x]?这给出了集合的描述:

FunctionSingularities
& # 10005

FunctionSingularities (Tan [x], x)

可以使用减少

减少
& # 10005

减少(%,x)

到目前为止,非常简单。但事情很快变得更加复杂:

FunctionSingularities
& # 10005

函数奇点[ArcTan[x^y], {x, y}, complex]

你还可以问一些更复杂的属性:

FunctionMeromorphic
& # 10005

函数亚纯[Log[z],z]

FunctionMeromorphic
& # 10005

函数亚纯[{Log[z], z > 0}, z]

我们在内部使用了各种功能测试属性,很长一段时间。但是,使用版本12.2函数属性更完整并完全暴露任何人使用。想知道你是否可以互换两个限制的顺序?查看FunctionSingularities.想知道能否在积分中做多元变量变换吗?查看FunctionInjective

是的,甚至是在Plot3D我们经常使用FunctionSingularities为了弄清楚到底发生了什么:

Plot3D
& # 10005

plt3d [Re[ArcTan[x^y]], {x, - 5,5}, {y, - 5,5}]

主流视频

12.1版我们开始了介绍视频的过程作为Wolfram语言的内置特性。版本12.2继续该过程。在12.1中,我们只能在台式机笔记本上处理视频;现在它扩展到云笔记本——所以当你用Wolfram语言生成一个视频时,它可以立即部署到云上。

12.2中一个主要的新视频功能是VideoGenerator.提供一个功能,使图像(和/或音频),和VideoGenerator将从中生成视频(此处为4秒视频):

VideoGenerator
VideoGenerator
& # 10005

视频发生器[Graphics3D[增广多面体[],# - 2],ImageSize -> {200,200}] &, 4]

要添加音轨,我们可以使用VideoCombine

VideoCombine
& # 10005

VideoCombine[{%,\!\(\*标记框[RowBox[{“CloudGet”,“[”,“\”\\“,”]“}],Audio`AudioBox[“AudioClass”->“AudioData”],可编辑->错误,可选择->错误]\)}]

那么我们如何编辑此视频?在版本12.2中,我们具有标准视频编辑功能的程序化版本。视频分割,例如,在特定时间分割视频:

视频分割
& # 10005

{VideoSplit[%。3, 5, 2}]

但是Wolfram语言的真正力量在于系统地将任意函数应用到视频中。VideoMap让你对一个视频应用一个函数来得到另一个视频。例如,我们可以逐步模糊我们刚刚制作的视频:

VideoMap
VideoMap
& # 10005

VideoMap[模糊图像,20秒时间]&,%]

还有两个新的功能分析视频-VideoMapListvideomaptimeereries.分别生成一个列表和一个时间序列通过对视频中的帧应用函数,并对其音轨

另一个新功能-高度相关视频处理和视频编辑录像带,它决定了任何给定的标准在视频中应用的时间间隔:

录像带
& # 10005

视频间隔[%,长度[主要颜色[#图像]]<3&]

例如,我们可以删除视频中的这些间隔

视频删除
& # 10005

VideoDelete [%, % %]

在实际处理视频时,一个常见的操作是转码。在版本12.2中,函数videotranscode.让你转换一个视频在任何超过300我们支持的容器和编解码器.顺便说一下,12.2也有新的功能ImageWaveformPlotImageVectorscopePlot通常用于视频色彩校正:

ImageVectorscopePlot
& # 10005

[" https://wolfr.am/ROWzsGFw "]] ImageVectorscopePlot [CloudGet

处理视频的主要技术问题之一是处理典型视频中的大量数据。在版本12.2中,现在对数据存储的位置有了更精细的控制。的选项GeneratedAssetLocation(用默认GeneratedAssetLocation美元)允许您在不同的文件、目录、本地对象存储等之间进行选择。

但是在版本12.2中还有一个新函数用于处理“轻量级视频”,其形式为AnimEnticImage.AnimEnticImage.只需采取图像列表并生成一个立即在您的笔记本中播放的动画 - 并具有直接存储在笔记本中的一切:

AnimEnticImage.
& # 10005

AnimatedImage[Table[Rasterize[Rotate[Style["W", 40], \[Theta]], {\[Theta], 0,2 Pi, 1}]]

大计算?将它们发送到云提供商!

它经常出现在我身上,尤其是我们的物理项目. 我有一个大的计算我想做,但我不想(或不能)在我的电脑上做。相反,我想做的是在云中作为批处理作业运行它。

只要云计算提供商存在,这在原则上是可能的。但这是非常复杂和困难的。现在,在版本12.2中,它终于变得简单了。给定任何一段Wolfram语言代码,您可以直接使用RemoteBatchSubmit将其作为批处理作业发送到云中运行。

在批处理计算提供程序端需要一些设置。首先,你必须有一个适当的供应商的帐户-这是我们最初支持的AWS批慈善引擎.然后您必须使用该提供商进行配置(并且我们有描述如何做到这一点的工作流程).但是一旦完成,您将获得一个远程批量提交环境,基本上是开始提交批处理作业所需的所有内容:

env = RemoteBatchSubmissionEnvironment
& # 10005

env = RemoteBatchSubmissionEnvironment["AWSBatch", <|"JobQueue" -> "arn:aws:batch:us-east-1:123456789012:job-queue/MyQueue", "JobDefinition" -> "arn:aws:batch:us-east-1:123456789012:job-definition/MyDefinition:\ 1", "IOBucket" -> "my-job-bucket"|>]

那么,提交a神经网络培训?下面是我如何在我的机器上本地运行它(是的,这是一个非常简单的例子):

净额
& # 10005

NetTrain [NetModel(“LeNet”),“MNIST”)

这是我将它发送到AWS Batch上运行的最小方法:

工作= RemoteBatchSubmit
& # 10005

作业= RemoteBatchSubmit[env, NetTrain[NetModel["LeNet"], "MNIST"]]

我得到一个对象,它表示我的远程批处理作业-我可以询问一下我的工作出了什么问题。一开始它只会告诉我我的工作是“可运行的”:

工作
& # 10005

Job [“JobStatus”]

后来,它会说它是“开始”,然后“跑”,然后(如果一切顺利)“成功”。一旦工作完成,就可以恢复这样的结果:

工作
& # 10005

工作(“EvaluationResult”)

你可以检索到很多关于实际发生的细节。这是原始作业日志的开头:

工作日志
& # 10005

工作(“JobLog”)

但是,在云中远程运行计算的真正意义在于,它们可能比您在自己的机器上运行的计算更大、更复杂。下面是我们如何运行与上面相同的计算,但现在请求使用GPU:

RemoteBatchSubmit
& # 10005

RemoteBatchSubmit[env,NetTrain[NetModel[“LeNet”],“MNIST”,TargetDevice->“GPU”],RemoteProviderSettings-><|“GPUCount”->1}]

RemoteBatchSubmit还可以处理并行计算。如果您要求多核机,可以立即运行平行图等等。但你可以更进一步RemoteBatchMapSubmit-它会自动将你的计算分布到云中的整个独立机器集合中。

这里有一个例子:

工作= RemoteBatchMapSubmit
& # 10005

作业= RemoteBatchMapSubmit[env, ImageIdentify, WebImageSearch["happy", 100]]

当它运行时,我们可以动态显示作业的每个部分的状态:

工作
& # 10005

工作(“DynamicStatusVisualization”)

大约5分钟后,作业完成:

工作
& # 10005

Job [“JobStatus”]

下面是我们的结果:

ReverseSort
& # 10005

ReverseSort[计数[工作[“EvaluationResults”]]]

RemoteBatchSubmitRemoteBatchMapSubmit为常规批计算提供对云计算服务的高级访问。但是在版本12.2中,还有一个直接的底层接口可用,例如自动气象站

AWS连接:

aws = ServiceConnect
& # 10005

AWS = ServiceConnect [“AWS”]

通过身份验证后,您可以看到所有可用的服务:

AWS.
& # 10005

aws[“服务”]

这就给了亚马逊翻译服务:

AWS.
& # 10005

AWS [“getservice”,“名称” - >“翻译”]

现在,您可以使用此命令调用服务:

%
& # 10005

%[“TranslateText”,“Text”->”今日は良い一日だった", "SourceLanguageCode“->auto”、“TargetLanguageCode”->“en”]

当然,你总是可以做到语言翻译直接通过Wolfram语言:

TextTranslation
& # 10005

TextTranslation["今日は良い一日だった”)

你能做一个10维图吗?

绘制包含一维、二维或三维的数据很简单。对于上面的几个维度,您可以使用颜色或其他样式。但当你处理十个维度的时候,它就失效了。例如,如果你在10D中获取了大量数据,那么你可能需要使用类似于降维试图梳理出“有趣的特征”。

但是如果你只是处理一些“数据点”,还有其他的方法来可视化一些东西,比如10维数据。在12.2版中,我们引入了几个函数来实现这一点。

作为第一个例子,让我们看看ParallelAxisPlot.这里的想法是,每个“维度”都绘制在一个“单独的轴”上。对于一个点来说,它并不是那么令人兴奋:

ParallelAxisPlot
& # 10005

ParallelAxisPlot[{10,17,19,8,7,5,17,4,8,2}},PlotRange->{0,20}]

下面是我们随机绘制三个“10D数据点”的结果:

ParallelAxisPlot
& # 10005

passplyaxisplot [randominteger [20,{3,10}],plotrange  - > {0,20}]

但它的一个重要特征是ParallelAxisPlot默认情况下,它会自动确定每个轴上的比例,因此不需要轴来表示类似的对象。例如,这里有7种完全不同的化学元素量:

ParallelAxisPlot
& # 10005

ParallelAxisPlot [EntityValue[“元素”,{EntityProperty“元素”,“过程”,EntityProperty[“元素”,“AtomicRadius”],EntityProperty[“元素”,“BoilingPoint”],EntityProperty[“元素”,“ElectricalConductivity”],EntityProperty[“元素”,“MeltingPoint”],EntityProperty[“元素”,“NeutronCrossSection”],EntityProperty[“元素”,“ThermalConductivity”]}]]

不同类型的高维数据在不同类型的图上表现最好。版本12.2中的另一种新的绘图类型是径向轴图.(这种类型的情节也被称为雷达情节、蜘蛛情节和星图。)

径向轴图以不同方向绘制每个标注:

径向轴图
& # 10005

RadialAxisPlot [EntityValue[“元素”,{EntityProperty“元素”,“过程”,EntityProperty[“元素”,“AtomicRadius”],EntityProperty[“元素”,“BoilingPoint”],EntityProperty[“元素”,“ElectricalConductivity”],EntityProperty[“元素”,“MeltingPoint”],EntityProperty[“元素”,“NeutronCrossSection”],EntityProperty[“元素”,“ThermalConductivity”]}]]

当没有太多的数据点时,它通常是最有信息的:

径向轴图
& # 10005

RadialAxisPlot[EntityValue[{Entity["City", {"Chicago", "Illinois", "UnitedStates"}], Entity["City", {"Dallas", "Texas", "UnitedStates"}], Entity["City", {"NewYork", "NewYork", "UnitedStates"}], Entity["City", {"LosAngeles", "California", "UnitedStates"}]}, {EntityProperty["City", " medianhomesalprice "], EntityProperty["City", " medianhomesalprice "], EntityProperty["City", " medianhomesalprice "],“总销售税率”],EntityProperty[“城市”,“住户收入中位数”],EntityProperty[“城市”,“人口”],EntityProperty[“城市”,“区域”]},“EntityAssociation”],PlotLegends -> Automatic]

三维阵列图

早在1984年,我就用克雷超级计算机二维细胞自动机随时间演化的三维图像(是的,用35毫米的幻灯片拍摄):

细胞自动机幻灯片

我一直在等36年来拥有一个非常简化的方式来复制这些。现在终于在版本12.2中我们有它:ArrayPlot3D.我们已经在2012年推出了image3d.表示和显示由具有指定颜色和透明度的3D体素组成的3D图像。但它的重点是“放射学风格”工作,其中体素之间的连续性有一定的假设。如果您真的有一个离散的离散数据(如蜂窝自动机),不会导致酥脆的结果。

这是一个稍微复杂一点的3D细胞自动机的例子:

表格
& # 10005

表[ArrayPlot3D[CellularaAutomaton[{14,{2,1},{1,1},{{{1}},0},{{{t}}]],{t,20,40,10}]

另一个新的ArrayPlot-family函数在12.2中为ComplexArrayPlot,这里适用于an来自牛顿方法的值数组

ComplexArrayPlot
& # 10005

表(ArrayPlot3D [CellularAutomaton [{{2 1}, {1 1 1}}, {{{{1}}}, 0}, {{{t}}}], PlotTheme——>“网络”),{40 t, 10日,10}]

推进可视化的计算美学

在Wolfram语言中,我们的目标之一是让可视化“自动看起来很好”——因为他们有有效实现良好计算美学的算法和启发式。在12.2版中,我们为各种类型的可视化调整了计算美学。例如,在12.1中,这是切片矢量绘图3D默认情况下看起来像:

切片矢量绘图3D
& # 10005

SliceVectorPlot3D [{y + x, z - y}, {2 x 2}, {y, 2 2}, {z, 2 2}]

现在它看起来像这样:

矢量图

从版本10开始,我们也越来越多地使用我们的PlotTheme选项,以“切换”详细选项,使可视化适合不同的目的,并满足不同的审美目标GeoregionValueplot..下面是默认设置的一个例子(顺便说一下,已经更新了):

GeoregionValueplot.
& # 10005

GeoregionValueplot [CloudGet [“https://wolfr.am/rowdoxaw”]  - >“gdp”]

这是“市场营销”情节的主题:

GeoregionValueplot.
& # 10005

GeoRegionValuePlot [CloudGet[“https://wolfr。一个米/ROWDoxAw"] -> "GDP", PlotTheme -> "Marketing"]

版本12.2中的另一件事是添加了新的原语和新的“原材料”来创建美观的视觉效果。在我们介绍了12.1版之类的东西哈奇菲林交叉影线。在版本12.2中,我们现在也有线性梯度填充

图形
& # 10005

图形[Style[Disk[],LinearGradientFilling[{RGBColor[1,0.71,0.75],RGBColor[0.64,Rational[182255],Rational[24425]}]]

现在我们可以将这种效果添加到情节填充中:

情节
& # 10005

Plot[2 Sin[x] + x, {x, 0,15}, FillingStyle -> LinearGradientFilling[{RGBColor[0.64, Rational[182, 255], Rational[244, 255]], RGBColor[1。, 0.71, 0.75]},顶部],填充->底部]

更时尚的是,你可以使用新地图绘制随机点ConicGradientFilling

图形
& # 10005

图形[表[风格[磁盘[RandomReal[20,2]], ConicGradientFilling[RandomColor[3]]], 100]]

制作代码比较漂亮

Wolfram语言的核心目标是定义一种易于被计算机和人类理解的一致的计算语言。我们(尤其是我!)在语言的设计上下了很大的功夫,并进入诸如此类的事情为函数选择正确的名称.但是,为了使语言尽可能容易阅读,精简“非语言”或句法方面也很重要。对于函数名,我们基本上是利用人们对自然语言单词的理解。对于句法结构,我们希望利用人们的“环境理解”,例如,从数学等领域。

十多年前我们引进了作为指定的方式函数函数,所以不用写

函数
& # 10005

函数[x,x^2]

(或2),你可以这样写:

x |  - > x ^ 2
& # 10005

x |  - > x ^ 2

但进入你必须输入\[功能]或者至少FN.,这让人感觉“有点难”。

在版本12.2中,我们正在“主流化”让打字成为可能,就像|->

X | - > X ^2
& # 10005

X | - > X ^2

你也可以这样做

{x,y}|->x+y
& # 10005

{x,y}|->x+y

以及:

同样的
& # 10005

SameTest -> ({x, y} |-> Mod[x - y, 2] == 0)

在版本12.2中,还有另一个新的“短语法”://=

假设你得到了一个结果,叫做calledres.现在你想应用一个函数到res,然后是“更新”res”。新功能适用于(书面//=)很容易做到这一点:

res=10
& # 10005

res=10

res / / = f
& # 10005

res / / = f

res
& # 10005

res

我们总是在寻找重复的“计算块”,我们可以“打包”到具有“易于理解的名称”的函数中。在版本12.2中,我们有几个新的这样的函数:FoldWhile折叠山学家FoldList通常情况下,只需要取一个列表并将每个后续元素“折叠”到它所构建的结果中,直到它到达列表的末尾:

FoldList
& # 10005

折叠列表[f,{1,2,3,4}]

但如果你想“早点停下来怎么办?折叠山学家让你这样做。所以这里我们连续除以1、2、3,…,当结果不再是整数时停止:

折叠山学家
& # 10005

折叠式Hillelist[Divide,5!,Range[10],IntegerQ]

更多阵列体操:列操作及其概括

让我们说你有一个数组,比如:

{{a, b, c, d}, {x, y, z, w}
& # 10005

{{a, b, c, d}, {x, y, z, w}

地图允许您通过此阵列的“行”映射函数:

地图
& # 10005

映射[f, {{a, b, c, d}, {x, y, z, w}}]

但是,如果你想在阵列的“列”上操作,有效地“减少”阵列的第一维度?在版本12.2中的功能ArrayReduce让你这样做:

ArrayReduce
& # 10005

ArrayReduce[f, {{a, b, c, d}, {x, y, z, w}}, 1]

如果我们告诉别人会发生什么ArrayReduce要“减少”数组的第2维:

ArrayReduce
& # 10005

ArrayReduce[f, {{a, b, c, d}, {x, y, z, w}}, 2]

这里真的发生了什么?阵列具有尺寸2×4:

维
& # 10005

尺寸[{{a,b,c,d},{x,y,z,w}]]

ArrayReduce(f,…1)“减少”第一个维度,留下一个带有维度的数组{4}ArrayReduce(f,…2)减少第二个维度,留下一个具有维度的数组{2}

我们来看一个稍微大一点的情况,2×3.×4阵列:

数组= ArrayReshape
& # 10005

array = array重塑[Range[24], {2,3,4}]

这现在消除了“第一维度”,留下3×4阵列:

ArrayReduce
& # 10005

数组减少[f,数组,1]

维
& # 10005

维度[%]

另一方面,这消除了“第二个维度”,留下了一个2×4阵列:

ArrayReduce
& # 10005

数组减少[f,数组,2]

维
& # 10005

维度[%]

为什么这很有用?一个例子是,当您有不同维度对应于不同属性的数据数组时,然后您希望“忽略”某个特定属性,并聚合与该属性相关的数据。假设您要忽略的属性处于级别n在您的阵列中。然后你所做的就是“忽略”它是使用ArrayReduce(f,…n], 在哪里f是聚合值的函数(通常类似于总计的意思是).

你可以达到和ArrayReduce按适当的顺序转置应用等等。但是it’s quite messy, andArrayReduce提供了这类数组操作的优雅“打包”。

ArrayReduce非常通用;它不仅可以“减少”单个维度,还可以“减少”整个维度集合:

ArrayReduce
& # 10005

ArrayReduce[f, array, {2,3}]

ArrayReduce
& # 10005

ArrayReduce [F,Array,{{{2},{3}}]

在最简单的层面上,ArrayReduce是在数组上应用“柱线”的便捷方式。但是,在完全普遍的情况下,它是一种用任意指数应用于子阵列的功能。如果您正在考虑张大人,ArrayReduce是对收缩,其中可以涉及两个以上的索引,并且在应用运算(不一定是求和)之前,可以对元素进行“平化”。

观看您的代码运行:更多在回声系列中

在调试代码中有一句古老的格言:“放入一个打印语句”。但它在Wolfram语言中更优雅,特别是感谢回声.这个想法很简单:回声expr." echo "(即打印)的值expr.,然后返回该值。所以结果是你可以把回声代码中的任何地方(通常是回声…)而不影响代码的功能。

在版本12.2中,有一些新的函数遵循“回声第一个例子是回声标签,它只是给回显的内容添加了一个标签:

回声标签
& # 10005

EchoLabel[“a”]@5!+EchoLabel[“b”]@10!

Aficionados可能想知道为什么回声标签是必要的。毕竟,回声它本身允许第二个可以指定标签的参数。答案是——是的,这是一种微妙的语言设计——如果你只是插入回声作为要应用的函数(例如with)),那么它只能有一个参数,所以没有标签。回声标签是否设置有操作员形式回声标签标签回声标签标签] [expr.相当于回声expr.标签

12.2中另一个新的“回声功能”是EchoTiming,以秒为单位显示其计算的时间:

表格
& # 10005

表[长度[EchoTiming[排列[范围[n]]]], {n, 8,10}]

使用两者往往有助于回声EchoTiming

长度
& # 10005

长度[呼气波[释放[Range [Echo @ 10]]]]

顺便说一下,如果你总是想打印计算时间(就像Mathematica 1.0默认情况下32年前)您可以随时全局设置以前美元EchoTiming

12.2中另一个新的“回声功能”是回声评估与“之前”和“之后”对应的是一个评估:

回声评估
& # 10005

EchoEvaluation [2 + 2]

您可能想知道嵌套会发生什么回声评估s。这里有一个例子:

回声评估
& # 10005

EchoEvaluation[积累[EchoEvaluation[反向[EchoEvaluation[范围[10]]]]]]

顺便说一句,想要同时使用两者是很常见的EchoTiming回声评估

表格
& # 10005

表[EchoTiming@EchoEvaluation@FactorInteger[2^(50 n) - 1], {n, 2}]

最后,如果您希望在代码中保留echo函数,但希望您的代码“安静运行”,则可以使用new基特科要“安静”所有的回声(如安静的“安静的”消息):

QuietEcho@Table
& # 10005

QuietEcho@Table[EchoTiming@EchoEvaluation@FactorInteger[2^(50n)-1],{n,2}]

确认/附上:符号异常处理

你的程序出了问题吗?如果是这样,该计划应该做什么?如果忽略这些事情,就有可能编写非常优雅的代码。但是一旦人们开始检查,并且有了在出现问题时解开问题的逻辑,代码就会变得非常复杂,可读性也会大大降低。

我们能做些什么呢?在12.2版中,我们开发了一种高级符号机制来处理代码中出现的错误。基本上,我们的想法是插入确认(或相关函数)-有点像插入回声-“确认”程序中的某些内容正在执行它应该执行的操作。如果确认有效,那么您的程序将继续运行。但如果失败,程序就会停止——并退出到最近的封闭空间.从某种意义上说,“封闭”程序的区域,不让任何内部的错误立即传播出去。

让我们看看在一个简单的例子中是如何工作的。在这里,确认成功的“确认”y,只是返回它,和什么都不做:

括
& # 10005

附上(f (x,证实[y], z))

但现在让我们放没有美元在的地方y没有美元确认默认情况下,认为这是一个问题。所以当它看到没有美元,它停止了,退出到——这反过来又产生一个失败目的:

括
& # 10005

附上[f[x,确认[$Failed],z]]

如果我们放一些回声,我们会看到x是成功达到的,但是z不是;一旦确认失败了,它停止了一切:

括
& # 10005

附上[f[回声[x],确认没有美元,回声[z]]]

一个很常见的东西就是想用确认/当你定义一个函数时:

addtwo
& # 10005

addtwo[x_]:= Enclose[Confirm[x] + 2]

使用参数5,一切都正常工作:

addtwo
& # 10005

addtwo [5]

但是如果我们用失踪[]——这确认默认情况下,如果我们得到一个失败目的:

addtwo
& # 10005

addtwo[[]]失踪

我们可以用如果返回等等。但是even in this very simple case, it wouldn’t look as nice.

确认有一组它认为是“错误的”的东西(没有美元失败[...]失踪[...]是例子)。但是有关的函数允许您指定特定的测试。例如,ConfirmBy应用一个函数来测试是否应该确认表达式。

在这里,ConfirmBy确认2是一个数字:

括
& # 10005

附上[f[1,确认Y[2,编号Q],3]]

但是x难道不被认为是这样吗NumberQ

括
& # 10005

附件[f[1, ConfirmBy[x, NumberQ], 3]]

好了,让我们把这些碎片拼起来。让我们定义一个对字符串进行操作的函数:

世界
& # 10005

世界[x_]:=附上[Connermby [x,stringq] <>“世界!”]

如果我们给它一个字符串,一切都很好:

世界
& # 10005

世界[“你好”]

但如果我们给它一个数字ConfirmBy失败:

世界
& # 10005

世界[4]

但在这里,真正美好的事情开始发生了。假设我们想要映射世界通过列表,总是确认它得到一个好的结果。这里一切正常:

括
& # 10005

附上[Confirm[world[#]] & /@ {"a", "b", "c"}]

但现在出了问题:

括
& # 10005

附上[Confirm[world[#]] & /@ {"a", "b", 3}]

ConfirmBy在定义中世界失败,导致其封闭生产A.失败对象。那么这个失败对象引起的确认地图失败,和封闭给予失败整个事情的目标。再一次,我们可以用如果等等。但是确认/做得更有力,更优雅。

这些都是很小的例子。但是,确认/真的展示了他们的价值是大程序,并为处理错误和例外和定义它们的范围提供清晰的高级别框架。

除了确认ConfirmBy,也有ConfirmMatch,它确认表达式是否与指定的模式匹配。还有ConfirmQuiet,它确认表达式的求值不会生成任何消息(或者,至少不会生成您告诉它要测试的消息)。也有Constricsert.,它只需要一个“断言”(如p > 0),并证实这是真的。

当确认失败时,程序总是退出到最近的封闭区域,交付给一个失败对象,其中包含有关发生的故障的信息。当您设置,您可以告诉它如何处理它接收到的失败对象,或者只是返回它们(可能是封闭的)确认的年代,或将函数应用于其内容。

确认提供一种优雅的机制来处理错误,可以很容易地将其插入到程序中。但是,毋庸置疑的是,它们确实存在一些棘手的问题。让我举一个例子。问题是:是哪一个确认’s做了一个给定的真的附上吗?如果您已经编写了一段显式包含确认,这是很明显的。但是如果有确认它是在函数栈深处以某种方式生成的——也许是动态生成的?它类似于命名变量的情况。模块只需要在它的主体中直接(“词法上的”)查找变量。在变量可能出现的任何地方(“动态”地)查找变量。好吧,默认情况下工作如下模块,“词汇”寻找确认附上的年代。但是如果你包含了标签确认,您可以将它们设置为“查找彼此”,即使它们在同一段代码中不显式地“可见”。

功能稳定

确认/提供一种好的高级方法来处理程序或函数中出错的“流程”。但如果一开始就出了问题呢?在内置的Wolfram Language函数中,我们应用了一组标准的检查。是否有正确的参数数量?如果有选项,它们是否被允许选项,它们是否在正确的位置?在版本12.2中,我们添加了两个函数,它们可以对编写的函数执行这些标准检查。

这个说f应该有两个参数,但这里没有:

CheckArguments
& # 10005

checkkarguments [f[x, y, z], 2]

这里有一个方法CheckArguments函数基本定义的一部分:

f
& # 10005

f [args ___]:= null /;CheckArguments [F [args],2]

给它一个错误的参数数量,它将生成一条消息,然后返回未求值的,就像许多内置的Wolfram语言函数一样:

f
& # 10005

f [7]

辩论是版本12.2中的另一个新函数,它将函数中的“位置参数”与选项分开。设置功能选项:

选择权
& # 10005

选项[f] = {opt ->自动};

这需要一个位置参数,它会找到:

辩论
& # 10005

ArgumentsOptions[f[x, opt -> 7], 1]

如果它没有精确地找到一个位置参数,它会生成一条消息:

辩论
& # 10005

ArgumentsOptions (f (x, y), 1)

在您的代码后清理

你运行一段代码,它会做它该做的事——通常你不希望它留下任何东西。通常,您可以使用像这样的作用域结构模块BlockRandom.等来实现这一目标。但有时,当代码完成时,需要显式地“清理”设置的某些内容。

例如,您可能会在代码段中创建一个文件,并希望在特定的代码段结束时删除该文件。在12.2版本中,有一个方便的新函数用于管理如下内容:WithCleanup

WithCleanupexpr.清理评估expr.,然后清理-但是返回结果expr..这里有一个简单的例子(使用它真的可以实现得更好)).你是指派一个值x,取方块,然后清理x返回广场前:

WithCleanup
& # 10005

WithCleanup [x = 7;x ^ 2,明确[x]]

只要有一个既能进行清理又能返回正在求值的主表达式的构造就已经很方便了。但是一个重要的细节WithCleanup它还能处理中止正在进行的主要评估的情况。正常情况下,发出中止会导致一切停止。但是WithCleanup是为了确保即使中止行动也能进行清理。因此,如果清理涉及到,例如,删除一个文件,那么该文件将被删除,即使主操作被中止。

WithCleanup还允许给出初始化。因此,初始化完成,清除,但主评估中止:

WithCleanup
& # 10005

withcleanup [echo [1],abort [];回声[2],回声[3]]

顺便说一句WithCleanup也可以与确认/为了确保即使确认失败,也会进行某些清理。

日期- 37个新日历

今天是2020年12月16日,至少按照标准是这样公历通常在美国使用。但在世界各地,还有许多其他的日历系统正在被用于不同的目的,甚至更多的日历系统在历史上的某个时间或另一个时间被使用过。

在早期版本的Wolfram语言中我们支持一些常见的日历系统。但是在版本12.2中,我们增加了对日历系统的广泛支持—总共有41个。你可以把日历系统想成是测地学中的投影或几何学中的坐标系统。你有一个特定的时间:现在你必须知道它在你使用的任何系统中是如何表示的。就像GeoProjectionData,现在CalendarData它可以给你一个可用日历系统的列表:

CalendarData
& # 10005

CalendarData(“DateCalendar”)

这就是“现在”被转换成不同日历的表现形式:

CalendarConvert
& # 10005

& /@ CalendarData["DateCalendar"]

这里有许多微妙之处。有些日历纯粹是“算术”;另一些则依靠天文计算。然后是“跳跃变体”的问题。在公历中,我们习惯只添加一个2月29日。但是,中国的日历例如,可以在一年内添加整个“闰月”(例如,例如,可能有两个“第四个月”)。在Wolfram语言中,我们现在对这样的事情有一个象征性的表示,使用LeapVariant

DateObject
& # 10005

DateObject[{72,25, LeapVariant[4], 20}, CalendarType -> "Chinese"]

处理不同日历系统的一个原因是,它们被用来确定不同文化中的节日和节日。(另一个原因,尤其与像我这样的人有关学了不少历史,是在历史日期的换算牛顿他的生日最初被记载为12月25日,1642年但把它改成格里高利日期就太1643年1月4日.)

给定一个日历,人们通常想做的事情就是选择满足特定标准的日期DateSelect去做这个。因此,例如,我们可以在特定时间间隔内选择满足它们是星期三的标准的特定间隔内的日期:

DateSelect
& # 10005

DateSelect [DateInterval[{{{2020 4 1},{2020 4 30}}},“天”、“公历”,5。], #DayName == Wednesday &]

作为一个更复杂的例子,我们可以将当前选择美国总统选举日期的算法转换为可计算的形式,然后使用它来确定未来50年的日期:

DateSelect
& # 10005

DateSelect[{{2020}, {2070}}, "Day"], Divisible[#Year, 4] && #Month == 11 && #DayName ==周二&& Or[#DayNameInstanceInMonth == 1 && #Day =!= 1, #DayNameInstanceInMonth == 2 && #Day == 8] &]

新地理

到目前为止,Wolfram语言在地理计算和地理可视化方面有很强的能力。但我们会继续扩大我们的地理功能.在版本12.2中,一个重要的增加是空间统计(上面提到过)——它完全与geo集成在一起。但也有一些新的地理原语。一个是地理福道,用来计算事物的边界:

地理福道
& # 10005

geoboundary [cloudget [“https://wolfr.am/rowgpj4i”]]

GeoLength
& # 10005

GeoLength (%)

也有GeoPolygon,这是普通多边形的完整地理概括。其中一个棘手的问题GeoPolygon必须处理是作为地球上多边形的“内部”的重要性。在这里它正在挑选更大的区域(即围绕全球包装的区域):

地理学
& # 10005

地理[GeoPolygon[{{-50、70},{-90},{70年,50}}," LargerArea "]]

GeoPolygon可能还喜欢多边形-handle洞,或者实际上是任意层次的嵌套:

地理学
& # 10005

地理[GeoPolygon[Entity["AdministrativeDivision", {"Illinois", " usa "}] -> Entity["AdministrativeDivision", {"ChampaignCounty", "Illinois", " usa "}]]]

但最大的“即将到来的吸引力”是全新的地理图形和地图的渲染.在版本12.2中,它仍然是初步的(未完成的),但至少有实验性的支持基于矢量地图渲染. 从中得到的最明显的回报是地图在所有尺度下看起来都更加清晰。但另一个好处是我们能够为地图引入新的样式,在12.2版中,我们包含了八种新的地图样式。

这是我们的“旧式”地图:

地理学
& # 10005

地理学[实体[“建筑”,“eiffeltower :: 5H9W8”],Georange  - >数量[400,“米”]]

这是这种“经典”风格的全新矢量版本:

地理学
& # 10005

地理[实体["Building", "EiffelTower::5h9w8"], gebackground -> "VectorClassic", GeoRange -> Quantity[400, "Meters"]]

这是一个新的(矢量)风格,旨在web:

地理学
& # 10005

地理[实体["Building", "EiffelTower::5h9w8"], gebackground -> "VectorWeb", GeoRange -> Quantity[400, "Meters"]]

这是一个“黑暗”风格,适合拥有覆盖物的信息:

地理学
& # 10005

地理[实体["Building", "EiffelTower::5h9w8"], gebackground -> "VectorDark", GeoRange -> Quantity[400, "Meters"]]

导入PDF

想要分析PDF格式的文档?十多年来,我们一直能够从PDF文件中提取基本内容。但是PDF是一种高度复杂(并在不断发展)的格式,许多文档都有复杂的结构。然而,在版本12.2中,我们戏剧性地扩展了PDF导入功能,使得它变得更加现实,例如,从arXiv中随机抽取一篇论文,然后导入它:

进口
& # 10005

导入[”https://arxiv.org/pdf/2011.12174.pdf"]

默认情况下,您将获得每个页面(在本例中是所有100页)的高分辨率图像。

如果你想要文本,你可以用“纯文本”

进口
& # 10005

进口(“https://arxiv.org/pdf/2011.12174.pdf”、“明文”)

现在,您可以立即在论文中进行单词云:

WordCloud
& # 10005

WordCloud [%]

它从纸上挑选出所有的图像,并将它们做成拼贴画:

影像拼贴
& # 10005

ImageCollage(进口[“https://arxiv.org/pdf/2011.12174.pdf”,“图像”]]

您可以从每个页面获取URL:

进口
& # 10005

进口(" https://arxiv.org/pdf/2011.12174.pdf ", " url ")

现在挑出最后两个,然后这些网页的图像

Webimage / @拍摄
& # 10005

WebImage/@Take[Flatten[值[%]],-2]

根据生成方式的不同,pdf可以有各种各样的结构。“ContentsGraph”给出一个表示检测到的文档的整体结构的图:

进口
& # 10005

进口(“https://arxiv.org/pdf/2011.12174.pdf”、“ContentsGraph”)

是的,这确实是一个图表:

图
& # 10005

图(EdgeList [%]]

对于可填充表单的pdf,需要导入更多的结构。在这里,我从网上随机抓取了一张未填写的政府表格。进口给出一个关联,其键是字段的名称——如果表单已经填好,它也会给出它们的值,所以你可以立即对它们进行分析:

进口
& # 10005

导入[”https://www.fws.gov/forms/3-200-41.pdf“,“FormFieldRules”]

最新的工业强度凸优化

从版本12.0开始,我们已经添加了解决大规模优化问题的最先进的功能。在版本12.2中,我们继续完善了这些功能。

一个新事物是超级函数ConvexOptimization,它自动处理整个线性,线性分数,二次,半纤维和圆锥优化 - 给出最佳解决方案及其双重性质。在12.1中,我们添加了对整数变量的支持(即组合优化);在12.2中,我们还为复杂变量增加了支持。

但12.2中最大的优化新内容是引入了鲁棒优化参数优化.稳健优化可以让您在整个变量值范围内找到一个有效的优化。参数优化可以让你得到一个参数函数,为特定参数的任何可能值提供最优值。举个例子,它找到了最优xy对于α的任何(正)值:

parametricConvexOptimization.
& # 10005

ParametricConvexOptimization [(x - 1) ^ 2 + Abs [y] {(x + \[α])^ 2 < = 1,x + y > = \[α]},{x, y},{\[α]}]

现在求特定α的参数函数:

%
& # 10005

%[。76]

与Wolfram语言中的所有内容一样,我们已经投入了大量精力来确保凸优化无缝集成到系统的其余部分 - 因此您可以符号设置模型,并将其结果流入其他功能。我们还包括一些非常强大的凸优化求解器。但特别是如果您正在混合(即真实+整数)优化,或者您正在处理真正巨大的(例如1000万变量)问题,我们也可以访问其他外部求解器。因此,例如,您可以使用Wolfram语言作为“代数建模语言”设置问题,然后(假设您拥有适当的外部许可证)只是通过设置方法,说,“Gurobi”或“Mosek“您可以立即使用外部解算器运行您的问题。(顺便说一下,我们现在有一个用于添加更多解算器的开放式框架.)

支持组合符和其他正式构建块

可以说,我们在Wolfram语言中如此依赖的符号表达式(及其转换)的整个思想起源于此组合子- 刚才2020年12月7日庆祝了百年诞辰. 我们在Wolfram语言中使用的符号表达式的版本在很多方面都比原始的组合器更先进和可用。但在12.2版中——部分是为了庆祝combinators,我们想添加一个原始组合符的框架

举个例子组合器组合体,等,适当地呈现:

组合器
& # 10005

组合子[combinator]

但是我们如何代表一个组合者的应用到另一个组合者?今天我们写的东西:

f@g@h@x
& # 10005

f@g@h@x

但在数学逻辑的早期存在不同的惯例 - 涉及左关联应用程序,其中一个预期的“组合方式”生成“函数”而不是“值”从应用于事物的应用程序。所以在版本12.2中我们正在推出一个新的“应用程序运营商”应用,显示为(并作为\[应用程序]美联社):

应用
& # 10005

应用[f,应用[g,应用[h, x]]

应用
& # 10005

应用[应用[应用[f, g], h], x]

顺便说一句,我很期待应用——作为一个新的、基本的“构造函数”——在设置Wolfram语言的通用结构方面有多种用途(更不用说“应用程序”了)。

使用Wolfram语言中的模式转换来指定组合符的规则非常简单:

{组合子
& # 10005

{组合者\ [应用] x _ \ [应用] y _ \ [应用] z_:> x \ [应用] z \ [应用程序](y \ [application] z),combinatork \ [application] x _ \ [应用] y_:> x}

但人们也可以把组合子更“代数化”地看作是定义表达式之间的关系,现在有了一种理论AxiomaticTheory的。

在12.2,又加入了一些其他的理论AxiomaticTheory,以及一些新的属性。

欧几里得几何走向互动

版本12.0的主要进步之一是为欧几里得几何引入了符号表示:指定一个符号地质丝石,给出各种对象和约束,Wolfram语言可以“解决”它,并绘制满足约束的随机实例的图。在版本12.2中,我们实现了这种交互,因此您可以移动图中的点,并且(如果可能的话)所有内容都将交互式地重新安排,以保持约束。

这是一个简单的几何场景的随机实例:

RandomInstance
& # 10005

RandomInstance[{a, b, c, d}, {CircleThrough[{a, b, c}, d], Triangle[{a, b, c}], d == Midpoint[{a, c}]}]

如果你移动其中一个点,其他点将交互地重新排列,以保持几何场景符号表示中定义的约束:

RandomInstance
& # 10005

RandomInstance[{a, b, c, d}, {CircleThrough[{a, b, c}, d], Triangle[{a, b, c}], d == Midpoint[{a, c}]}]

这里到底发生了什么?基本上,几何变成了代数。如果你愿意,你可以得到代数公式

%
& # 10005

%[“代数形状”]

而且,不用说,您可以使用Wolfram语言的许多强大的代数计算功能来操作它。

除了交互性之外,12.2中还有另一个主要的新功能是不仅可以处理完整的几何场景的能力,还可以涉及在多个步骤中构建场景的几何结构。这是一个例子 - 恰好直接采取从欧几里得

RandomInstance
& # 10005

随机实例[GeometricScene[{\[FormalCapitalA]、\[FormalCapitalB]、\[FormalCapitalC]、\[FormalCapital]、\[FormalCapitalE]、\[FormalCapital]、{}}、{GeometricStep[{\[FormalCapitalA]、\[FormalCapitalB]}、线[{\[FormalCapitalA]、\[FormalCapital]、[FormalCapital]}],定义任意角度的BAC.],几何步[{\[FormalCapital]线[[FormalCapitalA]、[FormalCapitalB]、[FormalCapitalE]、[FormalCapitalA]、[FormalCapitalC]、[FormalCapital]、[FormalCapital]、[FormalCapital]==欧几里德立场[\[FormalCapitalA]、[FormalCapitalE],[FormalCapitalE],“将D和E放在AB上,与A等距的AC上,”],几何步[{Line[{[FormalCapital],[FormalCapital]],几何插入法[{\[FormalCapitalA],\[FormalCapital],\[FormalCapital],\[FormalCapital],\[FormalCapital],\[FormalCapital],\[FormalCapital],\[FormalCapital],[FormalCapital],“等边”,[FormalCapital],[FormalCapital],[FormalCapital],[FormalCapital],[FormalCapital],[FormalCapital],[FormalCapital],[FormalCapital],[FormalCapital],[FormalCapital],[DE],“等边”,“在DE

你得到的第一个图像基本上是建设的结果。和类似其他几何场景 - 现在是交互式。但是如果您鼠标鼠标,则会获取允许您迁移到早期步骤的控件:

RandomInstance
& # 10005


            

在前面的步骤中移动一个点,您将看到对构建中的后续步骤有什么影响。

欧几里德的几何形状是我们了解的数学的第一个公理系统。所以 - 2000年+多年 - 它令人兴奋我们终于可以计算它了.(而且,是的,它最终将连接AxiomaticTheoryFindEquationalProof等。)

而是认识到欧几里得几何学的原始公式,我们已经添加了他的命题的可计算版本(以及一堆其他“着名的几何定理”)。以上示例结果是欧几里得第一卷的9号命题.现在,举个例子,我们可以得到他在希腊语中的最初陈述:

实体
& # 10005

实体(“GeometricScene”、“EuclidBook1Proposition9”)(“GreekStatement”)

这是用现代的Wolfram语言写的——以一种计算机和人类都能理解的形式:

实体
& # 10005

实体(“GeometricScene”、“EuclidBook1Proposition9”)(“场景”)

还有更多种类的知识用于知识库

Wolfram语言故事的重要组成部分全尺度计算语言它能接近我们吗庞大的知识库关于这个世界的数据。知识库正在不断地更新和扩大,确实如此在12.1版之后基本上所有域都有更多的数据(通常是大量的)更新或添加或修改的实体。

但是,作为已经完成的工作的例子,让我提及一些补充。一个备受关注的领域是食物.到目前为止,我们有超过50万种食品的数据(相比之下,一个典型的大型杂货店可能有3万种商品)。随机选择一种食物:

RandomEntity
& # 10005

RandomEntity(“食物”)

现在生成营养标签:

%
& # 10005

%(“NutritionLabel”)

再举个例子,添加的新实体类型是物理效果。以下是一些随机的例子:

RandomEntity
& # 10005

随机性[“patheryeffect”,10]

作为一个可以利用该领域所有数据的例子,这里是发现这些影响的日期的柱状图:

日期直方图
& # 10005

datehistogram [EntityValue [“patheryEffect”,“discoverydate”,“一年”,plotrange  - > {{dateObject [{1700},“Gregorian”,-5.`],dateObject [{2000},年份“,”Gregorian“,-5.`]},自动}]

作为我们一直在做的另一个例子,现在还有一种可能被人们(开玩笑地)称为“举重”的领域——举重训练练习:

BenchPress
& # 10005

实体(“WeightTrainingExercise”、“BenchPress”)(“数据集”)

Wolfram知识库的一个重要特性是它包含符号对象,它不仅可以表示“普通数据”(如数字或字符串),还可以表示完整的计算内容。作为一个例子,版本12.2允许用户访问Wolfram示范项目-与所有活动的Wolfram语言代码和笔记本电脑-直接在知识库中。以下是一些随机演示:

RandomEntity
& # 10005

RandomEntity(“WolframDemonstration”,5)

属性值可以是动态交互式对象:

实体
& # 10005

实体[“wolframdemonstration”,“moorespiegelattractor”] [“操纵”]

因为所有的东西都是可计算的,例如,你可以立即制作一个图像拼贴的所有演示在一个特定的主题:

影像拼贴
& # 10005

ImageCollage[EntityValue[EntityClass[" wolframdemo ", "ChemicalEngineering"], "Thumbnail"]]

机器学习的持续故事

这是近7年自从我们第一次介绍分类预测,并开始了全面整合的过程神经网络进入Wolfram语言。主要有两个方向:第一是开发“超功能”,比如分类预测,尽可能自动执行基于机器学习的操作。第二个方向是提供一个强大的符号框架,以利用神经网络的最新进展(尤其是通过Wolfram神经网络知识库),并允许灵活的持续开发和试验。

版本12.2在这两个方面都有进展。新超函数的一个例子是面部识别.给它一小部分带标签的人脸例子,它就会尝试在图像、视频等中识别他们。让我们从网络搜索中获取一些训练数据(是的,有些嘈杂):

协会图
& # 10005

Faces = Image [#,图像,> 30]&/ @cownioSemap [flatten [findfaces [#,“图像”]&/ @ webimagesearch [“Star Trek”<>#]]&,{Jean-Luc Picard“,“William Riker”,“Phillipa Louvois”,“Data”}]

现在使用此培训数据创建面部识别器:

面部识别
& # 10005

识别器= FaceRecognize(脸)

现在我们可以用它来找出每一帧视频中谁在屏幕上:

VideoMapList
& # 10005

VideoMapList[识别器[FindFaces[#Image,“Image”]]和视频[URLDownload[”https://ia802900.us.archive.org/7/items/2000-promo-for-star-trek-the-next-generation/2000%20promo%20for%20Star%20Trek%20-%20下一代%20.ia.mp4“]]]/。m_缺少\[RuleDelayed]“其他”

现在绘制结果:

列表图
& # 10005

ListPlot[Catenate[MapIndexed[{First[#2], #1} &, ArrayComponents[%], {2}]], Sequence[ColorFunction -> ColorData["Rainbow"], Ticks -> {None, Thread[{Range[Max[ArrayComponents[rec]]], DeleteDuplicates[Flatten[rec]]}]}]]

在Wolfram神经网络知识库中,有一个新的网络正在被添加。自从12.1版本以来,大约增加了20种新的网络,包括许多新的变压器网,以及EfficientNet比如特征提取器贝奥伯特SciBERT专门训练过科学论文的文本。

在每一种情况下,网络都是可以立即访问和使用的NetModel.12.2版更新的东西是网络的可视化显示:

NetModel
& # 10005

NetModel[“基于1B单词\基准训练的ELMo上下文词表示”]

有很多新的图标,但是现在有一个明确的约定,圆形代表网的固定元素,而方形代表可训练的元素。此外,当图标有粗边框时,意味着图标内部有额外的网络,你可以通过点击看到。

不管它是来自NetModel或者您自己构造(或两者的组合),提取网络的“摘要图形”通常是很方便的,例如,这样您就可以将它放入文档或出版物中。问询处提供几个级别的汇总图形:

问询处
& # 10005

信息[NetModel[“CapsNet训练MNIST数据”],“汇总图形”]

我们的核心神经网络框架中有几个重要的补充,它们拓宽了我们可以访问的神经网络功能的范围。第一个是在版本12.2中,我们有用于图形和时间序列的本机编码器。举个例子,我们正在做一个特征空间图在20个随机命名图中:

FeatureSpacePlot
& # 10005

FeatureSpacePlot[GraphData /@ RandomSample[], 20]]

框架的另一个增强与模型诊断有关PredictorMeasurementsClassifierMeasurements为模型的性能提供了符号表示。在版本12.2中,为了响应许多请求,我们已经能够提供最终的预测,而不是模型,来创建一个PredictorMeasurements对象,我们已经简化了外观和操作PredictorMeasurements对象:

PredictorMeasurements
& # 10005

PredictorMeasurements[{3.2, 3.5, 4.6, 5}, {3,4,5, 6}]

的一个重要的新特性ClassifierMeasurements是计算校准曲线的能力,该校准曲线将从抽样测试集观察到的实际概率与分类器的预测进行比较。但更重要的是分类自动校准其概率,实际上试图“雕刻”校准曲线:

行
& # 10005

Row[{First@ClassifierMeasurements[classifier [training, Method -> "RandomForest", "Calibration" -> False], test, "CalibrationCurve"], " \[LongRightArrow] ", First@ClassifierMeasurements[classifier [training, Method -> "RandomForest", "Calibration" -> True], test, "CalibrationCurve"]}]

12.2版也开始对神经网络的构建方式进行重大更新。基本设置始终是将特定的层集合放在一起,这些层暴露了通过连接的数组索引的数量图中的显式边.版本12.2现在引入了FunctionLayer,它允许您提供更接近普通Wolfram语言代码的内容。例如,下面是一个特定的函数层:

FunctionLayer
& # 10005

FunctionLayer [2 * (# v。# m。{0.25, 0.75})。NetArray[<|"Array" -> {0.1, 0.9}|>] &]

这是函数层的显式表示NetGraph

NetGraph
& # 10005

NetGraph (%)

v命名为“输入端口”。的Netarray.是一个可学习的数组,这里只包含两个元素。

在某些情况下,使用“基于块”(或“图形化”)编程方法更容易将层连接在一起(我们已经努力确保连接可以尽可能自动地进行)。但是在某些情况下,使用“函数式”编程方法更容易FunctionLayer.目前,FunctionLayer只支持Wolfram语言中可用构造的一个子集——尽管它已经包含了许多标准数组和函数式编程操作,将来还会添加更多。

一个重要的特点是FunctionLayer它产生的神经网络将和其他神经网络一样高效,并且可以在gpu等平台上运行。但是对于Wolfram Language构造,您能做些什么呢FunctionLayer? 在12.2版中,我们添加了另一个新的实验函数-CompiledLayer-这扩展了可以有效处理的Wolfram语言代码的范围。

也许有必要解释一下里面发生了什么。我们的主要神经网络框架本质上是一个符号层,它为优化的底层实现组织事物,目前正在使用MXNetFunctionLayer有效地将某些Wolfram语言结构直接翻译到MXNet。CompiledLayer正在翻译wolfram语言LLVM然后转换为机器码,并将其插入MXNet中的执行过程中。CompiledLayer利用新的Wolfram语言编译器,以及其广泛的推理和类型声明机制。

假设某人在Wolfram语言框架中建立了一个宏伟的神经网络。一切都设置好了,这样网络就可以立即用于整个Wolfram语言超函数范围(分类FeatureSpacePlotAnomalyDetectionFindClusters,……)。但是,如果希望在外部环境中“独立”使用网络,该怎么办?在版本12.2中,我们引入了导出最近开发的网络的功能ONNX标准代表。

一旦有了ONNX形式的网络,就可以使用外部工具的整个生态系统将其部署到各种各样的环境中。一个值得注意的例子——现在这是一个相当精简的过程——是采用一个完整的Wolfram语言创建的神经网络在iPhone的CoreML中运行它,例如,它可以直接包含在移动应用程序中。

表格笔记本

收集结构化材料的最佳方式是什么?如果您只想获取一些项目,可以使用FormFunction(例如在云中部署)可以很好地工作。但是,如果你试图收集更长的更富裕的材料怎么办?

例如,假设您正在创建一个测验,希望学生输入一系列复杂的答案。或者假设您正在创建一个模板,供人们填写文档。在这些情况下,您需要的是我们在版本12.2:表单笔记本中引入的一个新概念。

表单笔记本基本上是一个笔记本,它被设置成一个复杂的“表单”,其中的输入可以是你习惯在笔记本上的所有东西。

表格笔记本的基本工作流程如下。首先,创建一个表单笔记本,定义希望表单笔记本用户填写的各种“表单元素”(或区域)。作为创作过程的一部分,您需要定义表单笔记本的用户在使用表单笔记本时所输入的材料会发生什么情况(例如,将材料放在Wolfram数据滴Databin,把资料发给一个云API比如,用电子邮件把材料作为一种象征性的表达方式发送出去)。

在编写完表单笔记本之后,您可以生成一个活动版本,该版本可以发送给任何将使用表单笔记本的人。一旦某人在已部署的表单笔记本的副本中填写了他们的材料,他们就会按下一个按钮,通常是“提交”,然后他们的材料就会以结构化的符号表达方式发送到表单笔记本的作者指定的目的地。

也许值得一提的是,形式笔记本与听起来很相似的东西:模板笔记本。从某种意义上说,模板笔记本与表单笔记本是相反的。表单笔记本是关于让用户输入将被处理的材料。另一方面,模板笔记本是由计算机生成材料,然后用来填充由模板笔记本定义的结构的笔记本。

好的,那么你是如何开始使用表格笔记本的呢?就去文件>>程序化的笔记本>笔记本创作形式

表格笔记本

这只是一个笔记本,你可以在上面输入任何你想要的内容——比如当人们“填写”这个表格笔记本时,你想要他们做什么。但是表单笔记本中还有一些特殊的单元格或单元格序列,我们称之为“表单元素”和“可编辑的笔记本区域”。这些是表单笔记本的用户“填写”的内容,以输入他们的“响应”,他们提供的材料是当他们按下“提交”按钮(或任何已定义的最终操作)时发送的内容。

在创作笔记本中,工具栏为您提供了可插入的可能表单元素的菜单:

表格笔记本

让我们选择输入字段作为一个例子:

表格笔记本

这一切意味着什么?基本上,表单元素由一个非常灵活的符号Wolfram Language表达式表示,这为您提供了一种指定您想要的表达式的方法。您可以在输入字段中提供一个标签和一个提示。但这是口译译员你开始看到Wolfram语言的力量。因为口译译员是接收表单笔记本用户在输入字段中输入的内容,并将其解释为可计算对象。默认情况下,它只是把它当作一个字符串。但它可以是"国家"或"MathExpression”。有了这些选择,材料将自动被解释为一个国家、数学表达式等,如果用户的输入不能被解释为指定的,用户通常会收到提示。

关于输入字段如何工作的细节,有很多选项。其中一些是在添加操作菜单:

表格笔记本

但是这个表单元素到底是什么呢?按下代码按下左边的标签可以看到:

表格笔记本

表格笔记本的用户会看到什么?按下预览选项卡查明:

表格笔记本

除了输入字段,还有许多其他可能的表单元素。有复选框、单选按钮和滑动条。一般来说,可以使用Wolfram语言中存在的任何丰富的符号用户界面结构。

一旦你完成了创作,你就按生成生成一个准备好提供给用户填写的表单笔记本设置定义了诸如“提交”操作应该如何指定,以及当表单notebook提交时应该做什么:

表格笔记本

那么,提交表单笔记本的“结果”是什么?基本上,它是一个协会,说明在表格笔记本的每个区域填写了什么。(区域由关联中的键标识,这些键是在创作笔记本中首次定义区域时指定的。)

让我们看看在一个简单的例子中是如何工作的。这是一个表单笔记本的创作笔记本:

表格笔记本

这是生成的表格笔记本,准备填写(假设您有12.2):
表格笔记本

以下是如何填写表单笔记本的样本:
表格笔记本

这就是“回来”的时候提交按:

表格笔记本

为了测试,你可以把这个关联交互地放在笔记本上。但在实践中,更常见的做法是将关联发送到一个数据库,将其存储在云对象中,或者通常将其放在一个更“集中”的位置。

注意,在这个例子的末尾,我们有一个可编辑的笔记本区域,在这里你可以输入自由格式的笔记本内容(包括单元格、标题、代码、输出等),这些内容在提交笔记本时都会被捕获。

表单笔记本是一个非常强大的想法,你会看到它们被广泛使用。第一个例子是Wolfram函数库Wolfram示范项目,等等,都变成了笔记本。我们也期望在教育环境中大量使用表格笔记本。作为其中的一部分,我们正在构建一个系统,利用Wolfram语言来评估表格笔记本(和其他地方)的反应。

您可以在12.2版的实验功能中看到这一点的开始AssessmentFunction-它可以钩在形式笔记本有点像口译译员.但即使没有计划中的全部能力AssessmentFunction仍然有大量的工作可以完成——在教育环境或其他方面——使用表格笔记本。

顺便说一下,表单笔记本在任何特殊情况下使用起来都非常简单,这是值得理解的。是的,他们有很多深度,这使他们能够做非常广泛的事情。它们基本上只是可能的,因为Wolfram语言的整个符号结构,以及Wolfram笔记本最终被代表为符号表达。但当涉及到为特定目的使用它们时,它们是非常流畅和直接的,在几分钟内创建一个有用的形式笔记本是完全现实的。

更多Notebookery

早在1987年,我们就发明了笔记本,上面有层次细胞等所有基本特征。但三分之一个世纪以来,我们一直在逐步完善和简化它们的工作方式。在版本12.2中,有各种各样有用和方便的笔记本新功能。

点击复制

这是一个非常简单的功能,但非常有用。当你在笔记本上看到一些东西时,你真正想要做的就是复制它(或者复制与它相关的东西)。那就用吧ClickToCopy

ClickToCopy
& # 10005

ClickToCopy [10 !]

如果您想要点击复制未计算的内容,请使用推迟

ClickToCopy
& # 10005

单击以复制[Plot[Sin[x],{x,0,10}],延迟[Plot[Sin[x],{x,0,10}]]

简化的超链接(和超链接编辑)

++h自1996年以来,已在Wolfram笔记本中插入超链接。但是在版本12.2中,有两个重要的新事物与超链接。首先,自动超链接可以处理各种不同的情况。第二,现代化和精简的超链接创建和编辑机制。

超链接创建和编辑

连接细胞

在版本12.2中,我们公开了一些我们在内部已经有一段时间的功能:将一个浮动的完全功能单元附加到任何给定单元(或盒,或整个笔记本)的能力。访问这个特性需要象征性的笔记本编程,但是它可以让您做非常强大的事情——特别是在引入上下文和“即时”接口方面。下面是一个例子,在单元格括号的右下角放置一个以质数计数的动态计数器:

attachcell.
& # 10005

obj = AttachCell [EvaluationCell[],面板(动态[我]],{“CellBracket”,底部},0,{,底部});做(PrimeQ[我]{我10 ^ 7});NotebookDelete (obj)

模板盒基础结构

有时候你所看到的不是你所拥有的是有用的。例如,您可能想在笔记本中显示一些内容J0x但要做到这一点BesselJ[0, x].多年来,我们一直解释作为一种为特定表达式设置的方法。但我们也有一个更普遍的机制TemplateBox-使您可以获取表达式,并分别指定它们应该如何显示和解释。

在12.2版中,我们进一步推广和简化了-TemplateBox,允许它合并任意的用户界面元素,以及允许它指定复制行为等内容。我们的新TE例如,X输入机制基本上就是新方法的一个应用TemplateBox

在这种情况下,,“texassistanttemplate”引用在笔记本样式表中定义的一项功能——其参数由中给出的关联指定TemplateBox

RawBoxes
& # 10005

RawBoxes [TemplateBox[< |“盒”——> FormBox [FractionBox(“1”,“2”),TraditionalForm],”错误 " -> {}, " 输入“- >”\ \压裂{1}{2}”、“状态”- >“盒子”| >,“TeXAssistantTemplate”]

云的桌面界面

Wolfram笔记本的一个重要特性是,它们被设置为在台式机和云中运行。甚至在Wolfram语言的不同版本之间也有很多持续增强就像笔记本电脑在云端的工作方式一样。但是在12.2版本中,桌面和云之间的笔记本电脑界面有了一些特别的简化。

在任何桌面笔记本中已经提供了几年的特别好的机制是文件>发布到云菜单项,它允许你拿起笔记本,并立即将其作为一个已发布的云笔记本,任何人都可以通过网络浏览器访问。在版本12.2中,我们简化了笔记本出版过程

当我在做演示时,我通常会创建一个桌面笔记本(或者使用一个已经存在的)。在演讲结束时,我的做法是将它发布到云上,这样观众中的任何人都可以与它互动。但是我怎么给每个人笔记本的网址呢?在虚拟环境中,你可以只使用聊天。但在实际的物理演示中,这是不可能的。在版本12.2中,我们提供了一个方便的替代方法:的结果发布到云包括一个二维码人们可以用手机捕捉,然后立即访问URL,与手机上的笔记本进行交互。

发布到云

还有一个值得注意的新项目可见的结果发布到云:“直接嵌入JavaScript”。这是一个链接Wolfram笔记本嵌入这使得云笔记本可以通过JavaScript直接嵌入到网页中

使用iframe将一个网页嵌入到另一个网页上总是很容易的。但是iframe有很多限制,比如需要预先定义它们的大小。Wolfram Notebook Embedder允许全功能的流体嵌入云笔记本,以及从网页的其他元素的笔记本脚本控制。并且自从Wolfram笔记本嵌入式被设置使用oEmbed嵌入标准,它可以立即用于基本上所有标准的web内容管理系统。

我们已经讨论过将笔记本电脑从台式机发送到云。但是版本12.2的另一个新特性是,从桌面浏览云文件系统更快、更容易——就像访问云文件系统一样文件>从云开文件>保存到云

保存到云

密码学和安全

我们想用Wolfram语言做的一件事就是让它尽可能容易地连接到几乎任何外部系统。在现代,一个重要的部分是能够方便地处理密码协议。自从我们开始介绍密码学5年前直接进入Wolfram语言,我惊讶于Wolfram语言的符号特性让我们能够澄清和简化与密码学相关的事情。

一个特别引人注目的例子是我们如何能够整合blockchains进入Wolfram语言(版本12.2增加了bloxberg还有几家正在筹备中)。在相继的版本中,我们处理了不同的密码应用。在版本12.2中,重点是密钥管理的符号功能。版本12.1已经引入SystemCredential用于处理本地“密钥链”密钥管理(例如,支持身份验证对话框中的“记住我”)PEM文件。

如果我们导入一个包含私钥的PEM文件,我们会得到一个漂亮的,符号表示私钥

私人=第一
& # 10005

私人=第一(进口[“ExampleData / privatesecp256k1.pem”]]

现在我们可以推出a公钥

公共= PublicKey
& # 10005

公共= PublicKey (%)

要是我们生成数字签名对于使用私钥的消息

生成数字签名
& # 10005

GenerateDigitalSignature(“你好”,私人)

那么这个验证签名使用我们派生的公钥:

VerifyDigitalSignature
& # 10005

VerifyDigitalSignature[{"Hello there", %}, public]

现代安全基础设施的一个重要组成部分是安全证书的概念,这是一种数字结构,允许第三方验证特定公钥的真实性。在版本12.2中,我们现在有一个安全证书的符号表示-提供程序所需要的,以与HTTPS相同的方式与外部实体建立安全通信通道:

进口
& # 10005

进口(“ExampleData / client.pem”)

只需键入SQL

在12.0版本中我们引入了强大的功能查询关系数据库象征性地在Wolfram语言中。这是我们如何连接到数据库

db = DatabaseReference
& # 10005

db = DatabaseReference[FindFile["ExampleData/ commerce-database.sqlite"]]

以下是我们如何连接数据库,以便其表可以像内置Wolfram Knowledgebase中的实体类型一样处理:

EntityRegister
& # 10005

EntityRegister [EntityStore [RelationalDatabase (db)]]

例如,现在我们可以请求给定类型的实体列表:

EntityList
& # 10005

entityList [“办公室”]

在12.2的新功能是,我们可以方便地进入“下面”这个图层,到直接执行SQL查询根据底层数据库,将完整的数据库表作为数据集表达式:

外部评估
& # 10005

ExternalEvaluate[db, "SELECT * FROM offices"]

这些查询不仅可以从数据库中读取数据,还可以向数据库中写入数据。为了使事情更加方便,我们可以有效地将SQL当作笔记本中的任何其他“外部语言”来对待。

首先,我们必须注册我们的数据库,说出我们希望我们的SQL要运行的内容:

RegisterExternalEvaluator
& # 10005

RegisterExternalevaluator [“SQL”,DB]

现在我们可以输入SQL作为输入,并直接在笔记本中得到Wolfram语言输出:

输入SQL

微控制器支持32位

你已经用Wolfram语言开发了一个控制系统或信号处理。那么如何将其部署到独立的电子设备上呢?在我们引入了12.0版本单片机工具包用于从符号Wolfram语言结构直接编译到微控制器代码。

我们已经收到了很多反馈,要求我们扩大微控制器的支持范围。所以在版本12.2中,我很高兴这么说我们正在增加对36个新微控制器的支持,特别是32位的:

支持的微控制器

下面是一个例子,我们在一个特定的微控制器上部署了一个符号定义的数字滤波器,显示了为这个特定的微控制器生成的简化的C源代码:

需要
& # 10005

需要(“MicrocontrollerKit”)

ToDiscreteTimeModel
& # 10005

ToDiscreteMemodel[ButterworthFilterModel[{3,2}],0.6]//Chop

MicrocontrollerEmbedCode
& # 10005

微控制器embedcode [%,<|“目标” - >“adafruitgrandcentralm4”,“输入” - > 0  - >“串行”,“输出” - > 1  - >“串行”|>,“/dev/cu.usbmodem14101”][“源代码”]

WSTPServer:Wolfram引擎的新部署

我们的长期目标是使Wolfram语言及其提供的计算智能尽可能无处不在。这样做的一部分是建立Wolfram引擎它实现了语言,以便可以在尽可能广泛的计算基础设施设置中部署它。

Wolfram桌面以及经典Mathematica主要为Wolfram引擎提供一个笔记本界面,运行在本地桌面系统上。也可以直接运行Wolfram引擎——作为命令行程序(例如通过WolframScript)在本地计算机系统上。当然,我们可以在云中运行Wolfram引擎,或者完全运行Wolfram云公共私人),或者通过更轻量级的云和服务器产品(现有的和即将推出的)。

但是在版本12.2中有了一个新的Wolfram引擎部署:WSTPServer.如果您在云中使用Wolfram Engine,则通常通过http或相关协议与它进行通信。但是三十多年来,Wolfram语言已经有了自己的专用协议来传输符号表达式及其周围的一切。最初我们称它为MathLink,但在最近几年,随着它的逐步扩展,我们称它为WSTP: theWolfram符号传输协议.顾名思义,WSTPServer所做的就是为您提供一个轻量级服务器,它提供Wolfram引擎,并允许您在本机WSTP中直接与它们通信。

为什么这很重要?基本上是因为它提供了一种管理持久性Wolfram语言会话池的方法,这些会话可以作为其他应用程序的服务运行。例如,通常每次调用WolframScript时,都会得到一个新的Wolfram引擎。但是通过使用wolframscript -wstpserver使用特定的“WSTP概要文件名”,您可以在每次调用WolframScript时获得相同的Wolfram引擎。您可以直接在本地计算机或远程计算机上执行此操作。

WSTPServer的一个重要用途是公开Wolfram引擎池,可以通过newRemoteEvaluate函数。也可以使用WSTPServer公开Wolfram引擎供平行图等。最后,由于WSTP已经(将近30年了!)成为了笔记本前端与Wolfram Engine内核通信的方式,现在可以使用WSTPServer来设置一个集中式的内核池,您可以将笔记本前端连接到该内核池,例如,即使切换到不同的笔记本前端,在不同的计算机上,也要在内核中运行特定的会话(甚至是特定的计算)。

RemoteEvaluate:在其他地方计算…

在“在任何地方使用Wolfram语言”的路线上,版本12.2中的另一个新函数是RemoteEvaluate.我们有CloudEvaluate哪一个在计算机中进行计算Wolfram云,或企业私有云.我们有平行评估它在预定义的并行子内核集合上进行计算。在12.2版中,我们有RemoteBatchSubmit它将批量计算提交给云计算提供商。

RemoteEvaluate是一个通用的、轻量级的“立即评估”函数,它允许您在任何具有可访问的Wolfram Engine的指定远程机器上进行计算。您可以使用ssh或wstp(或带有Wolfram Cloud端点的http)连接到远程计算机。

RemoteEvaluate
& # 10005

远程评估[”ssh://byblis67.wolfram.com“,标记为[Framed[$MachineName],现在]]

有时你会想要使用RemoteEvaluate在一系列计算机上执行系统管理之类的操作。有时您可能希望收集数据或将数据发送到远程设备。例如,您可能有一个覆盆子PI.计算机都有Wolfram引擎,然后你可以使用RemoteEvaluate从这些机器中检索数据。顺便说一下,你也可以用平行评估从内部RemoteEvaluate,所以您要让一台远程机器成为并行子内核集合的主服务器。

有时你会想要RemoteEvaluate以便在执行评估时启动Wolfram Engine的新实例。但随着WSTPServer您也可以使用持久的Wolfram语言会话。RemoteEvaluateWSTPServer是表示运行Wolfram引擎进程的一般符号框架的开头。版本12.2已经有了RemoteKernelObject$DefaultRemoteKernel它提供了表示远程Wolfram语言实例的符号方式。

还有更多(又名“以上皆非”)

我至少谈到了版本12.2的许多更大的新特性。但还有很多。额外的功能,增强,修复和一般的圆整和抛光。

就像在计算几何中,ConvexHullRegion现在涉及的是地区,而不仅仅是点数。有一些函数CollinearPointsCoplanarPoints对共线性和共面性的检验,或给出实现它们的条件。

还有更多的导入和导出格式。就像现在支持存档格式一样:7 z“,”ISO“,”RAR“,”ZSTD.”。也有FileFormatQbytearrayformatq.用于测试事物是否对应于特定的格式。

就核心语言而言,有一些东西需要定义,比如对复杂语言的更新ValueQ.也有rancorgeneratorstate.这给出了随机发生器状态的符号表示。

在桌面包(即。wl文件)编辑器中,有一个新的(有点实验性的)单元格格式按钮,它可以重新格式化代码,并控制代码应该如何“通风”(即换行时它应该有多密集)。

在Wolfram | Alpha模式笔记本中(默认情况下在中使用Wolfram | Alpha笔记本电脑版)还有其他新特性,比如针对特定函数使用的函数文档。

这里面还有更多表视图,以及一套大的新家具paclet创作工具在实验的基础上。

对我来说,我们已经能够在12.2版中汇集多少,并且一如既往地,我很兴奋它现在已经出去了,每个人都可以使用......

6评论

  1. 祝贺所有Wolfram Tem!!

    卢卡斯
  2. 恭喜!期待苹果硅版

    sacul
  3. 我可以看到Import[]的新功能可以用来构建方便的实用函数,例如,在(arXiv)论文中查找引用。在物理学中,常见的引用风格是省略论文的标题;示例代码“WebImage /@ Take[Flatten[Values[%]], -2]”显示了如何查看网页提供更多有用的信息(标题,摘要)。这只是12.2中不断增强的功能的一个例子。祝贺整个Wolfram团队。
    巴里

    巴里·斯托克斯
  4. 根据大多数文档,Ctrl-$以前分配给inputtingunderscript,现在分配给inputtingtex,如上面的justtypetex部分所述。我遗漏了什么,如何解决这种不一致性?
    我经常使用Underscripts来进行类型限制,并希望保留旧的功能。

    努尔真主努拉尼
    • 感谢您提醒我们注意这一点。新的快捷方式是Ctrl+Shift+,(逗号)。此快捷键和其他快捷键在“插入>排版>”下可见。尽管在菜单和一些12.2文档中更新了键盘快捷键,但忽略了一些文档参考。我们认为所有文档参考都应在即将发布的12.3版本中更新,并在reference.wolfra的在线文档中更新m、 com曾经12.3船。

      管理
  5. 我很高兴您仍在努力改进hyperlink UI,但您仍然没有修复其中的一个重要部分:
    当我将笔记本打印为PDF(使用macOS 11.4打印对话框并选择“另存为PDF”)时,超链接不会以任何用户可见的方式打印,无论是蓝色还是下划线或其他任何形式。而且似乎没有办法改变这一点。
    在PDF中单击它们的意义上保留了链接,按预期表现。但如果读者珍贵的话,如果可以点击链接并不明显,这是珍贵的效果!

    梅纳德·汉德里
Baidu