【问题标题】:FoldList like primitive in JFoldList 类似于 J 中的原语
【发布时间】:2014-05-02 01:15:43
【问题描述】:

Mathematica 有一个名为 FoldList FoldList function description 的内置函数。 J中有类似的原始动词吗?

(我知道J有一个^:动词,类似于NestFixedPoint。)

为了澄清我的问题,J 有二元动词,所以通常u / x1 x2 x3 变为x1 u (x2 u x3),其工作方式与FoldList 相同,但顺序相反。

除非函数u 采用与x 不同的形状y。在FoldList 中有一个初始x。在 J 中,如果 x3 是不同的形状,则必须依靠 < 将其打包在一起。例如,一个人必须打包和解包

   [list =. (;/ 3 3 4 3 3 34),(< 1 2)
+-+-+-+-+-+--+---+
|3|3|4|3|3|34|1 2|
+-+-+-+-+-+--+---+

   tf =: 4 : '<((> x) , >y)'


   tf/ list
+----------------+
|1 2 3 3 4 3 3 34|
+----------------+
    tf/\ |. list
+---+------+--------+----------+------------+--------------+----------------+
|1 2|1 2 34|1 2 34 3|1 2 34 3 3|1 2 34 3 3 4|1 2 34 3 3 4 3|1 2 34 3 3 4 3 3|
+---+------+--------+----------+------------+--------------+----------------+

这有点不方便。有更好的解决方案吗?

【问题讨论】:

  • 而且&lt; 不是一个通用的解决方案。假设我们要在列表 1 2 3 4 中插入 +,初始值为 1 2。box 和 unbox 似乎效率低下。
  • 需要纠正错误:u / x1 x2 x3是x1 u x2 u x3,因为J从右到左计算表达式,所以变成x1 u(x2 u x3),即为Eelvex指出“右折叠”
  • FoldList 的前两个元素是xf(x,a)。在 J 中,这两个必须是相同的“种类”。不便来自 J 的数据结构,而不是缺少 FoldList 动词。
  • 同意(并 +1'd)@Eelvex 评论这归结为 J 的类型系统。在 J 中,所有数组都是直线的(正交,即 N 维意义上的矩形)并且类型同质。所以这个问题可以提炼为“我如何收集 J 中不同的东西”,以及对 Zhe 最初观察到需要拳击的答案(收集不同的东西是 J 中盒子存在的理由)。至于不方便:嗯,这个用例之前已经注意到了,并且开发了各种方便:jsoftware.com/pipermail/programming/2006-May/002245.html

标签: j


【解决方案1】:

u/\ 非常接近(如果您不介意正确折叠):

+/\ 1 2 3 4
1 3 6 10

*/\1+i.10
1 2 6 24 120 720 5040 ...

 (+%)/\7#1. NB. continued fraction of phi
 1 2 1.5 1.66667 1.6 1.625 1.61538

edit对您的编辑:

FoldList 的前两个元素是xf(x,a)。在 J 中,如果您希望它们在同一个列表中,那么这两个必须具有相同的“种类”(形状+类型)。不便来自 J 的数据结构,而不是缺少 FoldList 动词。如果您从列表中排除 x,事情会变得更容易:

FoldListWithout_x =: 1 : 'u/ each }.<\y'

   ; FoldListWithout_x 1 2 3 4
┌─────┬───────┬─────────┐
│┌─┬─┐│┌─┬─┬─┐│┌─┬─┬─┬─┐│
││1│2│││1│2│3│││1│2│3│4││
│└─┴─┘│└─┴─┴─┘│└─┴─┴─┴─┘│
└─────┴───────┴─────────┘
   >+ FoldListWithout_x 1 2 3 4
3 6 10
   (+%) FoldListWithout_x 7#1
┌─┬───┬───────┬───┬─────┬───────┐
│2│1.5│1.66667│1.6│1.625│1.61538│
└─┴───┴───────┴───┴─────┴───────┘

下一个合乎逻辑的步骤是在进行折叠之后包含一个装箱的x,但这需要更复杂的代码或逐个案例的构造。例如:

FoldList =: 1 :'({.y) ; u FoldListWithout_x y'
+ FoldList 1 2 3 4
┌─┬─┬─┬──┐
│1│3│6│10│
└─┴─┴─┴──┘
; FoldList 1 2 3 4
┌─┬─────┬───────┬─────────┐
│1│┌─┬─┐│┌─┬─┬─┐│┌─┬─┬─┬─┐│
│ ││1│2│││1│2│3│││1│2│3│4││
│ │└─┴─┘│└─┴─┴─┘│└─┴─┴─┴─┘│
└─┴─────┴───────┴─────────┘

FoldList =: 1 :'(<{.y) ; u FoldListWithout_x y'
+ FoldList 1 2 3 4
┌───┬─┬─┬──┐
│┌─┐│3│6│10│
││1││ │ │  │
│└─┘│ │ │  │
└───┴─┴─┴──┘
; FoldList 1 2 3 4
┌───┬─────┬───────┬─────────┐
│┌─┐│┌─┬─┐│┌─┬─┬─┐│┌─┬─┬─┬─┐│
││1│││1│2│││1│2│3│││1│2│3│4││
│└─┘│└─┴─┘│└─┴─┴─┘│└─┴─┴─┴─┘│
└───┴─────┴───────┴─────────┘

【讨论】:

    【解决方案2】:

    我猜@Dan Bron 的评论值得回答。在http://www.jsoftware.com/pipermail/programming/2006-May/002245.html中讨论了一些解决方案

    如果我们定义一个副词(从上面的链接修改)

       upd =: 1 : 0
    :
     u&.> /\ ( <"_ x),<"0 y
    )
    

    然后

    1 2  , upd |. 3 3 4 3 3 34 
    ┌───┬──────┬────────┬──────────┬────────────┬──────────────┬────────────────┐
    │1 2│1 2 34│1 2 34 3│1 2 34 3 3│1 2 34 3 3 4│1 2 34 3 3 4 3│1 2 34 3 3 4 3 3│
    └───┴──────┴────────┴──────────┴────────────┴──────────────┴────────────────┘
    

    【讨论】:

      猜你喜欢
      • 2014-06-14
      • 1970-01-01
      • 2013-10-10
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多