2

拆箱或打开不同大小的盒子会导致数字填充 0 和文字填充空格:

v=.1 4 8 ; 2 6 4 ; 6 8 4 5; 7 8 9; 6 3 7 4 9

>v
1 4 8 0 0
2 6 4 0 0
6 8 4 5 0
7 8 9 0 0
6 3 7 4 9

fit ( !.) 连词通常用于这些事情,但是

>!. _1 v

不受支持并引发域错误。

我有这个,但是对于非常大的数组,它不是很快:

(>./ # every y) {.!. _1 every y

有没有一种有效的方法来定义打开盒子的填充值?

4

2 回答 2

1

我的猜测是,直接进行填充将是提高效率的途径,特别是如果需要仅限于特定的数据结构(如您的示例所建议的那样)。此解决方案尚未经过性能分析,但它显示了一个自己做填充的方法。

在这里,我假设该任务始终涉及从盒装列表到表格,并且数据始终是数字的。额外assert.的陈述可能值得添加,以证明正确的论点符合预期。

   v=.1 4 8 ; 2 6 4 ; 6 8 4 5; 7 8 9; 6 3 7 4 9   NB. example data

paddedOpen=: dyad define
 assert. 0 = # $ x
 Lengths=. #&> y
 PadTo=. >./ Lengths
 Padding=. x #~&.> PadTo - Lengths
 y ,&> Padding
)

   _1 paddedOpen v
1 4 8 _1 _1
2 6 4 _1 _1
6 8 4  5 _1
7 8 9 _1 _1
6 3 7  4  9

只有当默认值不能作为中介时,才需要先填充自定义值。如果默认值可以传递使用,那么让默认填充发生然后用首选值替换所有默认值会更快。从您的问题的性质来看,我假设默认值在主域中具有意义,因此简单的替换将不起作用。

请留下评论,告知我们不同技术的相对性能,或者至少一种技术是否足以满足您的目的。

于 2012-12-11T20:35:36.667 回答
1

环境

f =: 3 :'(>./ # every y) {.!. _1 every y'
g =: _1&paddedOpen

和(与您的精神相同f):

h =: 3 : '((>./# &> y)&($!._1))@> y'

我得到以下时间和空间的表现:

(100&(6!:2) ,: 7!:2) &.> 'f L';'g L';'h L'
┌─────────┬─────────┬─────────┐
│ 0.045602│0.0832403│0.0388146│
│4.72538e6│1.76356e7│4.72538e6│
└─────────┴─────────┴─────────┘

其中 L 是一个大数组:

L =. (<@(+i.)/)"1 ? 50000 2 $ 10

f您可以通过使其简洁来稍微改进;例如:

f =: ] {.!._1&>~ >./@:(#&>)

我认为没有太大的改进空间。

于 2012-12-12T00:49:26.323 回答