公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

+1 投票
2.0k 浏览

在Thread的帮助文档中看到这个例子:

算例试验如下:

data1 = Range@4;
data2 = Range[2, 3];
Thread[Position[data1, data2], List, {2}]

结果:

之后采用替换:

Thread[f[data1, data2], List, {2}] /. f -> Position

结果:

这时却成功了,请问直接使用函数出现问题的原因是因为最先计算Position[data1, data2]导致错误吗?如何解决?我试了下Hold还是不行。谢谢。


根据matmma的回答,我又换了个函数:

Thread[Take[data1, data2], List, {2}]
Thread[f[data1, data2], List, {2}] /. f -> Take

结果:

发现第一种先计算了 Take[data1, data2] ,因而得到的不是想要的结果,似乎要利用Thread的这个功能只能使用替换?

分类:函数 | 用户: 唐玉 (176 分)
修改于 用户:唐玉
在Thread的帮助文档里,“Possible Issues”里已经讨论了此问题和解决方法。
谢谢,如“野鹤”回复的,Unevaluated也无法解决问题。Thread[Unevaluated[Position[data1, data2]], List, {2}]
得到的结果是{}。

3 个回答

0 投票
 
已采纳

关于这个问题,@野鹤 也说了,用Map比较自然,不过,其实用Unevaluated也不是不可以,只是,你需要更进一步地调节计算次序:

data1 = Range[4];
data2 = Range[2, 3];
Thread[Unevaluated@Position[#, #2], List, {2}] &[data1, data2]

这里的重点在于让data1和data2的结构变为“显式”的,也就是说,要让Thread能够“看到”data1和data2的结构——是不是有人觉得“显式”这个词听起来有点耳熟?没错,这个就是Module和Manipulate都会面临的那个“问题”,这类“问题”在Mathematica里其实是普遍存在的,只不过广泛存在的自动计算机制使得它在大多数情况下都变得不明显了,但是这里我们用Unevaluate阻止了自动计算,它也就显现出来了。更多内容参考这里:http://mathematica.stackexchange.com/a/108627/1871

用户: xzczd (2.2k 分)
采纳于 用户:唐玉
+2 投票
Thread函数会先计算表达示部分,如果对表达式用Unevaluated还是不行,一般就只能像您说那样了。

不过,我一般都是使用Map或Apply解决相关问题,比如使用Map:

data1 = Range[4];
data2 = Range[2, 3];
Position[data1, #] & /@ data2

 

用户: 野鹤 (5.1k 分)
谢谢。对于我给的这个例子确实更适合用Map解决。有些复杂情况Thread的这个功能还是挺有用的,看来要利用这一点只能采用替换了。
+1 投票
对于Thread[f[data1, data2], List, {2}] ,他是先计算f只线性作用于第2个变量,此时f仅作为头部,而不是进行头部计算,而Thread[Position[data1, data2], List, {2}]中,则是进行了Position[data1, data2],的头部运算了,Thread[f[data1, data2], List, {2}] 的结果是{f[{1, 2, 3, 4}, 2], f[{1, 2, 3, 4}, 3]},对于这个结果再加上/.f -> Position,则是进行了头部替换,运算结果是{{{2}}, {{3}}}。
用户: 挖掘机小王子 (451 分)
那也就是说使用这种形式的话必须使用替换,如何直接使用某个具体的函数,由于会先计算f[data1, data2]而导致错误或不是想要的结果?
...