您可能已经错过了教授的第一堂课,如果您不了解其他编程语言的想法,再次查看以了解向量以及使用它们的难易程度可能会有所帮助;-)
假设您有一个A
数字从 1 到 7 的向量: A←⍳7 A 1 2 3 4 5 6 7
现在,如果您想搜索大于 3 的值,您可以:
A>3
0 0 0 1 1 1 1
结果也是一个向量,您可以在许多操作中轻松地将两者结合起来:
现在,再次查看您的 q,“深度”一词在 APL 中具有特定含义,我猜您的意思有所不同。我是否正确理解您想用这些值的“索引”替换值 > 2?好吧,根据我之前展示的内容,这很容易:
A←0 1 0 0 2 3 0
(A≥2)×⍳⍴A
0 0 0 0 5 6 0
编辑:查看多维数组:让我们看看这个例子:
A←(⍳5)∘.×⍳10
A
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
现在,哪些数字是 > 20 和 < 30?
z←(A>20)∧A<30
z
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 1 1 0 0 0
0 0 0 0 1 0 0 0 0 0
然后,您可以将这些值与该布尔结果相乘,以仅过滤出满足条件的值:
A×z
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 21 24 27 0
0 0 0 0 0 24 28 0 0 0
0 0 0 0 25 0 0 0 0 0
或者,也许您对值的列索引感兴趣?
z×[2]⍳¯1↑⍴z
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 7 8 9 0
0 0 0 0 0 6 7 0 0 0
0 0 0 0 5 0 0 0 0 0
注意:此语句可能不适用于所有 APL 方言。这是另一种表述方式:
z×((1↑⍴z)⍴0)∘.+⍳¯1↑⍴z
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 7 8 9 0
0 0 0 0 0 6 7 0 0 0
0 0 0 0 5 0 0 0 0 0
我希望这能给你一些想法。一般来说,在数学运算中使用布尔值来操作数组是 APL 中一个非常强大的想法,它将带你走很多路 ;-)
此外,如果您想看到更多相同的内容,请查看FinnAPL 成语- 这些年来成长的一些有用的矮子;-)
编辑重新。“维护未触及的值”:回到示例数组 A:
A←(⍳5)∘.×⍳10
A
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
用这些值的 2 次方替换 20 到 30 之间的值,保持所有其他值不变:
touch←(A>20)∧A<30
(touch×A*2)+A×~touch
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 441 576 729 30
4 8 12 16 20 576 784 32 36 40
5 10 15 20 625 30 35 40 45 50
我希望你明白这个想法...