You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请教APL代码R←((V⍳V)=⍳⍴V)/V的功能与具体含义

拆解APL代码:R←((V⍳V)=⍳⍴V)/V

嘿,我来帮你把这段APL代码拆解开,其实它的功能非常直观,而且确实像文中说的那样,对应处理'MUMMY'这类重复元素的场景!

先直接说功能:

这段代码的核心作用是提取向量V中的所有唯一元素,并且严格保留它们第一次出现的顺序。比如当V是('M' 'U' 'M' 'M' 'Y')时,运行后R会是('M' 'U' 'Y')——把重复的M去掉,只留下每个元素第一次出现的版本,这就是它和读'MUMMY'对应的地方。

分步拆解每个符号的作用:

我们从内到外、按APL右结合的运算顺序来拆:

  1. ⍳⍴V:生成位置索引向量

    • ⍴V:这个符号是求向量V的长度(元素个数),比如V有5个元素,⍴V就返回5;
    • ⍳:在这里是生成连续整数向量的功能,⍳n会生成从1到n的整数序列,所以⍳⍴V最终是1 2 3 4 5(对应V中每个元素的位置索引)。
  2. V⍳V:找到每个元素第一次出现的位置

    • ⍳在这里是索引查找的功能,A⍳B的含义是:返回B中每个元素在A里第一次出现的位置。所以V⍳V就是对V里的每一个元素,找到它首次出现在V中的索引。
    • 举个例子:如果V是('M' 'U' 'M' 'M' 'Y'),V⍳V的结果是1 2 1 1 5——第一个M在位置1,U在2,后面的M都指向第一次出现的1,Y在5。
  3. (V⍳V)=⍳⍴V:生成“首次出现”的掩码

    • 这是逐元素的相等比较,会生成一个布尔向量(1代表真,0代表假)。什么时候结果为1?当元素的首次出现位置等于它当前的位置时——也就是说,这个元素是第一次出现在V里的时候!
    • 还是用上面的例子,比较1 2 1 1 5和1 2 3 4 5,得到的布尔向量是1 1 0 0 1,对应第1、2、5个位置是首次出现的元素。
  4. /V:用掩码过滤向量

    • /在这里是过滤操作,前面的布尔向量作为“掩码”,保留V中对应位置为1的元素。用1 1 0 0 1过滤('M' 'U' 'M' 'M' 'Y'),就得到了('M' 'U' 'Y'),也就是最终的结果R。

再举个数值向量的例子:

如果输入V ← 3 1 4 1 5 9 2 6 5 3,运行这段代码后,R会是3 1 4 5 9 2 6——所有重复的元素都被去掉,只保留第一次出现的版本。

内容的提问来源于stack exchange,提问作者rnso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:43:42