非标准评估和 PackedArray

2023-12-21

我之前有过asked https://stackoverflow.com/questions/4181470/custom-function-with-non-standard-evaluation-behaves-like-table怎么做allTrue[{x,list},test]保护占位符的函数x从当前背景下的评估中,以同样的方式Table[expr,{x,...}]保护x

我最终使用的方法间歇性失败,我发现问题是由列表自动转换为 PackedArray 引起的。这是一个失败的例子

SetAttributes[allTrue, HoldAll];
allTrue[{var_, lis_}, expr_] := 
  LengthWhile[lis, 
    TrueQ[ReleaseHold[Hold[expr] /. HoldPattern[var] -> #]] &] == 
   Length[lis];
allTrue[{y, Developer`ToPackedArray[{1, 1, 1}]}, y > 0]

I want allTrue[{x,{1,2,3}},x>0]回来True不管是否{1,2,3}自动转换为PackedArray,更好的实现方法是什么?


这是我已经使用了很长一段时间的版本(最初是为我的书的第二版编写的,但我最终经常使用它)。如果参数代表一些未评估的代码,则测试函数必须具有HoldAll or HoldFirst属性,如果我们希望将代表一个特定子句的一段代码以其未评估的形式传递给它(这可能是也可能不是所需的)。

ClearAll[fastOr];
Attributes[fastOr] = {HoldRest};
fastOr[test_, {args___}] := fastOr[test, args];
fastOr[test_, args___] :=
TrueQ[Scan[
        Function[arg, If[test[arg], Return[True]], HoldAll],
        Hold[args]]];

编辑:我刚刚注意到问题中链接的页面底部 Daniel Reeves 的解决方案与此非常相似。主要区别在于,我关心短路和保持参数不被评估(见下文),而丹尼尔只关注短路部分。

它确实具有短路行为。我们需要HoldRest属性,因为我们希望以未计算的形式保留参数。我们还需要HoldAll (or HoldFirst) 纯函数中的属性,用于保留每个未计算的参数,直到将其传递给test。在用于正文之前是否对其进行评估test现在取决于的属性test。举个例子:

Clear[fullSquareQ];
fullSquareQ[x_Integer] := IntegerQ[Sqrt[x]];

In[13]:= Or @@ Map[fullSquareQ, Range[50000]] // Timing

Out[13]= {0.594, True}

In[14]:= fastOr[fullSquareQ, Evaluate[Range[10000]]] // Timing

Out[14]= {0., True}

这是一个示例,我们将一些引起副作用(打印)的代码片段作为参数传递。最后一个参数的代码没有机会执行,因为结果已经在前一个子句中确定:

In[15]:= fastOr[# &, Print["*"]; False, Print["**"]; False, 
  Print["***"]; True, Print["****"]; False]

During evaluation of In[15]:= *

During evaluation of In[15]:= **

During evaluation of In[15]:= ***

Out[15]= True

请注意,自从fastOr接受未评估的一般代码片段作为子句Or,你必须将你的值列表包装在Evaluate如果你不关心它们将在开始时被评估(就像Range上面的例子)。

最后,我将说明所持有代码的编程构造fastOr,展示如何使用它(如果您愿意,可以将其视为使用保留表达式的小型速成课程)。使用保留表达式时,以下函数非常有用:

joinHeld[a___Hold] := Hold @@ Replace[Hold[a], Hold[x___] :> Sequence[x], {1}];

Example:

In[26]:= joinHeld[Hold[Print[1]], Hold[Print[2], Print[3]], Hold[], Hold[Print[4]]]

Out[26]= Hold[Print[1], Print[2], Print[3], Print[4]]

以下是我们如何使用它以编程方式构造上面的 Print-s 示例中使用的保留参数:

In[27]:= 
held = joinHeld @@ MapThread[Hold[Print[#]; #2] &, 
      {NestList[# <> "*" &, "*", 3], {False, False, True, False}}]

Out[27]= Hold[Print["*"]; False, Print["**"]; False, Print["***"]; True, Print["****"]; False]

将其传递给fastOr,我们将使用另一个有用的惯用语:追加(或前置)到Hold[args]直到我们获得所有函数参数,然后使用Apply(请注意,一般来说,如果我们不希望我们附加/预先评估的部分,我们必须将其包装在Unevaluated,所以一般的习语看起来像Append[Hold[parts___],Unevaluated[newpart]]):

In[28]:= fastOr @@ Prepend[held, # &]

During evaluation of In[28]:= *

During evaluation of In[28]:= **

During evaluation of In[28]:= ***

Out[28]= True

关于你提到的原始实现,你可以看看我之前的评论。问题是 TakeWhile 和 LengthWhile 在 v.8.0.0 中存在打包数组的错误,它们在 8.0.1 的源代码中得到修复 - 因此,从 8.0.1 开始,您可以使用我的版本或 Michael 的版本。

HTH

Edit:

我刚刚注意到,在您提到的帖子中,您想要不同的语法。虽然采用中采取的方法并不是很困难fastOr对于这种情况,这里有一个不同的实现,可以说它与该特定语法的现有语言结构更接近。我建议使用Table和例外,因为迭代器Table接受与您想要的相同的语法。这里是:

ClearAll[AnyTrue, AllTrue];
SetAttributes[{AnyTrue, AllTrue}, HoldAll];
Module[{exany, exall},
 AnyTrue[iter : {var_Symbol, lis_List}, expr_] :=
    TrueQ[Catch[Table[If[TrueQ[expr], Throw[True, exany]], iter], exany]];
 AllTrue[iter : {var_Symbol, lis_List}, expr_] :=
   Catch[Table[If[! TrueQ[expr], Throw[False, exall]], iter], exall] =!= False;
];

几句话解释一下:我在顶层使用模块,因为我们只需要定义一次自定义异常标记,也可以在定义时执行此操作。跳出Table的方式就是通过异常。不是很优雅,并且会对性能造成很小的影响,但是我们购买了迭代器变量的自动动态本地化,由Table和简单性。为了以安全的方式做到这一点,我们必须使用唯一的标记来标记异常,这样我们就不会错误地捕获其他异常。我发现使用模块来创建持久异常标签通常是一个非常有用的技巧。现在,一些例子:

In[40]:= i = 1

Out[40]= 1

In[41]:= AnyTrue[{i, {1, 2, 3, 4, 5}}, i > 3]

Out[41]= True

In[42]:= AnyTrue[{i, {1, 2, 3, 4, 5}}, i > 6]

Out[42]= False

In[43]:= AllTrue[{i, {1, 2, 3, 4, 5}}, i > 3]

Out[43]= False

In[44]:= AllTrue[{i, {1, 2, 3, 4, 5}}, i < 6]

Out[44]= True

In[45]:= AllTrue[{a, {1, 3, 5}}, AnyTrue[{b, {2, 4, 5}}, EvenQ[a + b]]]

Out[45]= True

In[46]:= AnyTrue[{a, {1, 3, 5}}, AllTrue[{b, {2, 4, 5}}, EvenQ[a + b]]]

Out[46]= False

我从一项任务开始i表明迭代器变量的可能全局值并不重要 - 这是由Table。最后,请注意(正如我在其他地方评论的那样),您的原始签名AllTrue and AnyTrue有点过于严格,因为以下内容不起作用:

In[47]:= lst = Range[5];
AllTrue[{i, lst}, i > 3]

Out[48]= AllTrue[{i, lst}, i > 3] 

(因为事实上lst表示在模式匹配时未知的列表,因为HoldAll属性)。没有充分的理由保留此行为,因此您可以删除_List检查:AnyTrue[iter : {var_Symbol, lis_}, expr_]类似地对于AllTrue,并且将涵盖此类用例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

非标准评估和 PackedArray 的相关文章

  • 如何在 Mathematica 中定义与 D 交换的函数

    我想实现一个运算符f通勤与差异化D Unprotect D D f y x f D y x Protect D D f Sin x x D f Sin x 1 x 不幸的是这段代码产生了两个不同的结果 f Cos x as expected
  • mathematica 如何确定在替换中首先使用哪个规则

    我想知道如果给定多个替换规则 mma 如何确定在发生碰撞时首先应用哪个规则 一个例子是 x 3 x 2 s x 3 s 2 s x x gt 0 x OddQ gt 2 Thanks Mathematica 有一种机制能够在简单情况下确定规
  • 如何检查表达式是否包含复杂表达式?

    有没有办法检查表达式是否包含复杂表达式 虚数 文档说你无法检查表达式是否包含I因为它是如何解释的 我也尝试过ImaginaryQ expr expr Conjugate expr and Simplify expr Simplify Con
  • 制作自定义输入表和简短输入表

    我经常希望看到数学的图形对象不在FullForm但更具可读性InputForm能够通过双击来选择代码的一部分 并轻松地将此代码复制到新的输入中Cell 但默认的InputForm不允许这样做 因为InputForm默认显示为String 不
  • C# 中的复杂计算

    最好的 最有效的 工具是什么 NET C 用于计算 积分 偏导数 其他不平凡的数学 人们能否对 Mathematica 和 Matlab 及其集成发表评论C Math NET http www mathdotnet com是一个用 C 编写
  • 了解内核-前端通信——为什么我的前端冻结?

    EDIT 只需确认您是否可以重现此内容就会很有用 只需一台计算机即可尝试此操作 无需远程连接 Update似乎其他人无法在 Mac 或 Win7 上重现此问题 因此它要么是 WinXP 特定的 要么是我的机器特定的 此时我要放弃了 最好有一
  • 在 Mathematica 中使用多个包和引用构建应用程序包

    我正在 Mathematica 中构建一个应用程序包 应用程序包含多个包并引用其他应用程序包 为了设置一切 我使用并遵循了工作台帮助部分的应用程序包说明 该部分也可以在以下位置找到 http reference wolfram com wo
  • 无法从 {2,3,4,5,6,7,8} 获得的最小整数 (Mathematica)

    我正在尝试使用 Mathematica 解决以下问题 从集合中无法获得的最小正整数是多少 2 3 4 5 6 7 8 通过算术运算 求幂和括号 集合中的每个数字必须仅使用一次 不允许一元运算 例如 如果不使用 0 则 1 无法转换为 1 例
  • $多个变量的假设

    我想将整个笔记本的变量限制在特定范围内 有没有一种方法可以一次性做到这一点 而无需为每个变量输入不同的 asstitution 行 编辑 我想定义笔记本中所有计算的变量域 谷歌搜索帮助我更好地构建我的需求 全局定义如下 Assumption
  • 有没有办法自动将Matlab 中的结果或数据导入到Mathematica 中?

    有没有办法将结果或数据 例如矩阵 从Matlab导入到Mathematica自动地 或者有什么方法可以先运行Matlab程序 然后运行Mathematica程序自动地 感谢您提供任何有用的答案 至少有三种方法可以解决这个问题 通过 Java
  • Mathematica 8 中函数声明的问题

    这是一个奇怪的结果 在此示例中函数定义为 functionB 有人可以解释一下吗 我想绘制functionB x and functionB Sqrt x 它们一定是不同的 但是这段代码表明functionB x functionB Sqr
  • 在 MathLink 函数中检查中止?

    我刚刚发现这样的MathLink功能为LinkWrite and LinkRead有类似其内部的东西CheckAbort吸收任何中止 并且不会进一步传播它们 这可以很容易地显示为LinkRead link LinkLaunch First
  • 将符号暴露给 $ContextPath

    有多种Internal 有用的上下文函数 例如InheritedBlock https stackoverflow com questions 4198961 what is in your mathematica tool bag 568
  • 如何让 Mathematica 内核暂停以创建外部文件

    是否可以在计算期间暂停 Mathematica 内核 这是一个例子 Module Mathematica code Calls an external program with some argument Needs to wait for
  • 如何以编程方式访问 Mathematica 8 中有关“Graph”对象的信息?

    我正在尝试访问某个范围内的信息GraphMathematica 8 中的对象 出于某种原因 Part命令似乎不起作用 myGraph是我想要访问的对象 下面的第一行显示 myGraph 其他人的作用是检查它 myGraph myGraph
  • 下标变量

    有没有什么方法可以强制 Mathematica 独立于无下标变量来处理下标变量 进一步来说 比如说 我有以下定义 Subscript b 1 1 2 Subscript b 2 3 4 b Join Subscript b 1 Subscr
  • 如何在 Mathematica 8 中并行集成

    有人知道如何使用所有核心来计算积分吗 我需要使用并行化或并行表 但如何使用 f r Sum 1 n 2 r 2 n 7 2 n n r 2 n 1 x r 2 n 1 n 0 r 2 Nw Transpose Table f j i 1 j
  • NDS 求解波动方程时的不稳定性

    我正在尝试使用NDSolve求解波动方程 以检查使用它是否比我的旧特征方程更容易和 或更快 方法实施 我得到了很多特征方法没有得到的不稳定性 并且由于这些是简单的方程 我想知道出了什么问题 希望不是问题的物理方面 ans Flatten N
  • Mathematica 的模式匹配优化不佳?

    我最近询问了为什么PatternTest引起了大量不必要的评估 PatternTest 未优化 https stackoverflow com questions 8484299 patterntest not optimized列昂尼德回
  • 自动保存笔记本(或mathematica中的其他类型文件)文件

    我现在有时会遇到这个问题 部分原因是 Microsoft Office 自动保存您正在使用版本和自动恢复处理的文件 很多时候 当我在mathematica中启动一个新笔记本来做一些测试或其他事情时 我经常忘记保存我正在做的事情 时不时地 根

随机推荐

  • 如何正确配置 NSFetchedResultsController

    我将 NSFetchedResultsController 放入我的代码中 这样我就可以对表视图数据进行很好的自动分段 所以我正在运行测试以确保一切正常 我的持久存储中有一个 Book 实体 我将首先以旧方式执行获取 然后尝试使用 NSFe
  • Django Admin:根据先前的字段值填充字段

    我在 django admin 中有一个模型如下 ChoiceA on false on false on true on true ChoiceB always always never never id models CharField
  • SAFESEH:NO 选项的实际作用

    我正在尝试使用boost asio spawn功能就像在example http www boost org doc libs 1 55 0 doc html boost asio example cpp03 spawn echo serv
  • 使用 Javascript 向用户发送 HTTP 附件(打开浏览器的“另存为...”对话框)

    我是网络开发的新手 所以如果这个问题很菜鸟 我深表歉意 我想在 Javascript 中请求时向用户提供服务器硬盘上的文件 即发送 HTTP 附件以触发浏览器的 另存为 对话框 用户单击页面上的按钮 服务器根据他 她的一些帐户设置 和其他参
  • 在 Unity 中查找一组 3D 点的定向边界框

    我有一组 3D 点 或者实际上是小球体 我需要使用 Unity 3D 将它们包围在尽可能小的 3D 框内 在封闭框只能移动和缩放的情况下 解决方案非常简单 您只需迭代所有点并封装每个点即可 但我还需要找到盒子的最佳方向 因此 为了用 ASC
  • 使用 R 在 postgres 中设置模式名称

    我正在使用 R 连接到 PostgreSQL 数据库 使用以下函数完成连接 dbConnect m dbname dbname host host port port user user password password m是驱动程序 p
  • Java Applet 使用 Chrome 浏览器启动客户端程序的替代方案是什么?

    我正在使用 ASP net 和 C 开发 Web 应用程序 我的目标是检查客户端计算机上的桌面应用程序 如果它存在 那么我应该启动它 否则 如果它不存在 我们应该下载 安装然后启动它 我可以使用 Java Applet 开发这个模块 但不幸
  • Perl 函数名称冲突

    我遇到的情况是 我正在使用的模块有一个函数 其名称与我自己的模块中的函数完全相同 当我尝试调用模块中的函数时 OO Perl 所以 self gt function 它改为从其他模块调用该函数 我已经通过重命名我的函数来解决这个问题 但有趣
  • 如何处理Excel工作表中的数据更改事件以刷新所有数据透视表?

    我有一个应用于工作表及其更改的 VBA 代码 因此 每当工作表中有新条目或删除 任何更改 时 它都会刷新附加到它的所有数据透视表 Private Sub Worksheet Change ByVal Target As Range This
  • 检查python脚本中是否挂载了NFS共享

    我编写了一个 python 脚本 该脚本依赖于某个可用的 NFS 共享 如果未安装 NFS 共享 它会很乐意将文件复制到应安装的本地路径 但稍后当它尝试将在 NFS 服务器上创建的某些文件复制回来时会失败 我想专门捕获这个错误 这样我就可以
  • 使用 PNG 图像作为 GrabCut 的蒙版

    我有一个带有绿色和红色线条以及透明背景的 png 图像 我需要使用它作为执行 GrabCut 的遮罩 但我得到了意想不到的结果 这是我的代码 find the mask Mat mask mask create image size CV
  • 关闭弹出窗口并导航到 jQuery Mobile 中的另一个页面

    当用户按下弹出窗口内的按钮时 我试图关闭弹出窗口 对话框 并导航到另一个页面 单页面应用程序 多个 页面 jQM 1 4 0 如果我点击弹出窗口中的 是 按钮 它将导航到我想要的 page3 然后跳回起始页 如果我注释掉 popup clo
  • Go 中的一流函数

    我来自 JavaScript 它具有一流的函数支持 例如 您可以 将一个函数作为参数传递给另一个函数 从函数返回一个函数 有人能给我一个例子来说明如何在 Go 中做到这一点吗 Go语言和函数式编程 http livingcode org 2
  • MSMQ 或 Service Broker 或用于 FIFO 消息处理的批量插入?

    我们有一个场景 需要针对传入的实时事件对数据库使用更新 插入查询 我们可以选择下面提供的任何一个选项 1 MSMQ 2 SQL 服务代理 3 自定义构建的缓存机制 使用文件缓存 批量插入 触发器将插入转换为更新 如果行已存在 等 我们没有使
  • 如何在 GitHub 操作构建期间引用我的存储库中的目录?

    我有一些测试数据用于 pytest 的单元测试 我用环境变量设置了它们的位置 查看我的 pytest 日志 构建会看到环境变量 但它们引用的位置不存在 在 GitHub Actions 文档中 存储库应位于 home runner Repo
  • 在 Glassfish 服务器上的 Web 服务中使用数据库时出现“找不到合适的驱动程序”错误

    我有一个 Java Web 应用程序 并使用来自消费者 Java 应用程序的操作来处理 MySQL 数据库 当我尝试连接到数据库时 我得到 No suitable driver found for jdbc mysql localhost
  • 检索 Delphi 窗口句柄

    我正在尝试从外部应用程序获取 Delphi 应用程序的窗口句柄 我可以看到创建了一些窗口 TApplication TFrmMain 和其他一些窗口 并且我知道 TApplication 是 控制器 但从不可见 但是 我可以读取真实窗口的值
  • Rails form_for 提交按钮不起作用

    感谢您的耐心等待 对于 Rails 来说还是很陌生 使用 Rails 3 2 为一个简单的应用程序制作注册页面 我的问题是 无论表单中的信息是否有效 表单上的提交按钮都不会产生任何效果 用户模型和数据库似乎都工作正常 如果我从 Rails
  • 保存带有透明度/Alpha 通道的 TIFF

    这是我的问题 我需要创建一个 TIFF 和一个 PNG 其中调色板包含特定颜色和 Alpha 我实际上能够处理 PNG 但不能处理 TIFF 我在互联网上搜索并发现 TIFF 应该处理透明度 但并非所有软件都可以 我尝试了很多方法来加载 T
  • 非标准评估和 PackedArray

    我之前有过asked https stackoverflow com questions 4181470 custom function with non standard evaluation behaves like table怎么做a