作业帮 > 综合 > 作业

这条Mathematica命令怎么运行的

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/11/05 12:15:56
这条Mathematica命令怎么运行的
partition[l_,v_,comp_]:=Flatten/@Reap[
Scan[
Which[com[#,v],Sow[#,-1],
comp[v,#],Sow[#,1],True,Sow[#,0]&,l],{-1,0,1}][[2]]
用法:
partition[{3,5,7,9,2,4,6,8,3,4},4,Less]
Scan命令如何运作的没看明白
Reap命令里面的{-1,0,1}是用来干什么的
还有就是Sow[#,
正确的式子
partition[l_,v_,comp_] :=
Flatten /@
Reap[Scan[
Which[comp[#,v],Sow[#,-1],comp[v,#],Sow[#,1],True,
Sow[#,0]] &,l],{-1,0,1}][[2]]
貌似无法运行你就不会查查哪里出错了么?2楼的正解,太聪明了,你给我讲讲~
……
Which[com[#,v],Sow
……
这个com[#,v]应该是comp[#,v]吧?
还有那个Which调用的参数也太多了吧?
Which called with 7 arguments
再问: partition[l_, v_, comp_] := Flatten /@ Reap[Scan[ Which[comp[#, v], Sow[#, -1], comp[v, #], Sow[#, 1], True, Sow[#, 0]] &, l], {-1, 0, 1}][[2]]
再答: 这个函数的意思是将l中的每个元素与v进行comp关系下的对比,然后按照对比的结果将l进行分组。 以你上面运行的那个命令为例 partition[{3,5,7,9,2,4,6,8,3,4},4,Less] 就是判断(Which)集合{3,5,7,9,2,4,6,8,3,4}中那些元素比4小(comp[#, v],),那些比4大(comp[v, #],),那些既不比4大也不比4小(True),然后将他们进行分组(Reap)。 最后的结果就表示为 {{3, 2, 3}, {4, 4}, {5, 7, 9, 6, 8}} 第一个部分是比4小的元素组成的集合; 第二部分是既不比4大也不比4小的元素组成的集合; 第三部分是比4大的元素组成的集合。 其中partition函数中的Which[comp[#, v], Sow[#, -1], comp[v, #], Sow[#, 1], True, Sow[#, 0]] 就是判断#与v关系comp如何的语句。 在你列出的这个例子中这个式子被替换成 Which[Less[#, v], Sow[#, -1], Less[v, #], Sow[#, 1], True, Sow[#, 0]] 这个判断就是实现我上面说起来很拗口的那段分组的基础。 如果#比v小那么这个判断语句就返回Sow[#,-1]; 如果v比#小那么这个判断语句就返回Sow[#,1]; 如果在上如两种关系之外,这个判断语句就返回Sow[#,0]; 在这里Sow[#,x]可以看成是给#装上了一个标签x, 在上面的那一段话说你可以看出我们通过比较给#分别上了三种标签-1,1,0 这就是你很想知道的Reap命令中{-1,0,1}的由来, Reap命令实质上就是按照这种标签{-1,0,1}将上述带标签的各种元素进行了分组。 你可以参考你自己举出的那个例子返回的结果进行理解。 或者你可以将标签的名称或者是顺序进行任意的修改,你就能更好的掌握Reap、Sow的使用方法。 至于Scan是一个很简单函数, 他就是将l中的每一个元素代入上述的关系判断语句Which[comp[#, v], Sow[#, -1], comp[v, #], Sow[#, 1], True, Sow[#, 0]]&中进行逐一判断。 如果听不明白可以参考一下下面这个简单的例子, Scan[Print, {a, b, c}] 运行一遍你就了解了。 partition函数中Scan真正比较难理解的,我觉得在#和&的使用上。 不过你没问,我也就不费口舌了。 开饭喽!