对J Tally的误解(#)

3 arrays j rank

在J中,要查找可以使用的元素数量#right?

例如

# 2 3 4 5 6
5
Run Code Online (Sandbox Code Playgroud)

好.那么多维数组呢?

b=: 2 3 4 $ i.2

   b
0 1 0 1
0 1 0 1
0 1 0 1

0 1 0 1
0 1 0 1
0 1 0 1
Run Code Online (Sandbox Code Playgroud)

这里#b是2.我猜是因为第一个维度的长度为2,即数组的帧.

所以,如果我稍微改变它:

b=:3 2 4 $ i.2
   b
0 1 0 1
0 1 0 1

0 1 0 1
0 1 0 1

0 1 0 1
0 1 0 1
Run Code Online (Sandbox Code Playgroud)

这有3个,因为领先尺寸长度为3,对吧?

但我无法解释这个:

#\b
1 2 3
Run Code Online (Sandbox Code Playgroud)

我通过b的元素计算.所以我认为每个2x4子阵列都会被使用,我希望#\ b能够给出

2 2 2
Run Code Online (Sandbox Code Playgroud)

因为:

c=:2 4 $i.2
   c
0 1 0 1
0 1 0 1
   #c
2
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,为什么#\ b = 1 2 3?我认为这与动词排名有关,对吧?我很难理解这个话题......

Eel*_*vex 6

看看发生了什么事情最简单的方法是框<\b:

   <\b
?????????????????????????
?0 1 0 1?0 1 0 1?0 1 0 1?
?0 1 0 1?0 1 0 1?0 1 0 1?
?       ?       ?       ?
?       ?0 1 0 1?0 1 0 1?
?       ?0 1 0 1?0 1 0 1?
?       ?       ?       ?
?       ?       ?0 1 0 1?
?       ?       ?0 1 0 1?
?????????????????????????
Run Code Online (Sandbox Code Playgroud)

u\y适用uy前缀:

<\1 2 3
?????????????
?1?1 2?1 2 3?
?????????????
#\1 2 3
1 2 3
*/\1 2 3
1 2 6
Run Code Online (Sandbox Code Playgroud)

因此,#\b为您提供每个b前缀的项目数.

你可能认为你会得到的是b的2级数:

#"2 b
2 2 2
<"2 b
?????????????????????????
?0 1 0 1?0 1 0 1?0 1 0 1?
?0 1 0 1?0 1 0 1?0 1 0 1?
?????????????????????????
Run Code Online (Sandbox Code Playgroud)