Vector 域错误问题

Vector 域错误问题,vector,Vector,当我计算一个空向量(v)中最大值和最小值之间的差时←⍳0)使用⌈⌿(⌈/c) -⌊⌿(⌊/c) ,它给了我一个域错误。该语句适用于法向量和矩阵 我如何处理异常,以便在向量为空时它不会给我错误?它不应该返回任何内容,也不应该只返回零。正如我在注释中提到的,它可以用于条件执行,因此您可以简单地检查空向量并给出不同的答案 然而,这可以用更传统/纯的APL方法实现 此版本仅适用于一维 在APL字体中: Z←DIFFERENCE V ⍝ Calculate difference between vecto

当我计算一个空向量(v)中最大值和最小值之间的差时←⍳0)使用⌈⌿(⌈/c) -⌊⌿(⌊/c) ,它给了我一个域错误。该语句适用于法向量和矩阵


我如何处理异常,以便在向量为空时它不会给我错误?它不应该返回任何内容,也不应该只返回零。

正如我在注释中提到的,它可以用于条件执行,因此您可以简单地检查空向量并给出不同的答案

然而,这可以用更传统/纯的APL方法实现

此版本仅适用于一维

在APL字体中:

Z←DIFFERENCE V
⍝ Calculate difference between vectors, with empty set protection
⍝ Difference is calculated by a reduced ceiling subtracted from the reduced floor
⍝ eg. (⌈⌿(⌈V)) - (⌊⌿(⌊V))
⍝ Protection is implemented by comparison against the empty set ⍬≡V
⍝ Which yields 0 or 1, and using that result to select an answer from a tuple
⍝ If empty, then it drops the first element, yielding just a zero, otherwise both are retained
⍝ eg. <condition>↓(a b) => 0 = (a b), 1 = (b)
⍝ The final operation is first ↑, to remove the first element from the tuple.
Z←↑(⍬≡V)↓(((⌈⌿(⌈V)) - (⌊⌿(⌊V))) 0)
Z←差异V
⍝ 计算向量之间的差值,带空集保护
⍝ 差额由减少的楼层减去减少的天花板计算
⍝ 例如(⌈⌿(⌈五) )-(⌊⌿(⌊五) )
⍝ 通过与空集进行比较来实现保护⍬≡v
⍝ 这将产生0或1,并使用该结果从元组中选择答案
⍝ 如果为空,则删除第一个元素,只产生一个零,否则两者都保留
⍝ 如。↓(a b)=>0=(a b),1=(b)
⍝ 最后的手术是第一次↑, 从元组中删除第一个元素。
Z←↑(⍬≡(五)↓(((⌈⌿(⌈五) )-(⌊⌿(⌊五) ))0)
或者使用大括号表示法,适用于没有字体的人

Z{leftarrow}DIFFERENCE V
{lamp} Calculate difference between vectors, with empty set protection
{lamp} Difference is calculated by a reduced ceiling subtracted from the reduced floor
{lamp} eg. ({upstile}{slashbar}({upstile}V)) - ({downstile}{slashbar}({downstile}V))
{lamp} Protection is implemented by comparison against the empty set {zilde}{equalunderbar}V
{lamp} Which yields 0 or 1, and using that result to select an answer from a tuple
{lamp} If empty, then it drops the first element, yielding just a zero, otherwise both are retained
{lamp} eg. <condition>{downarrow}(a b) => 0 = (a b), 1 = (b)
{lamp} The final operation is first {uparrow}, to remove the first element from the tuple.
Z{leftarrow}{uparrow}({zilde}{equalunderbar}V){downarrow}((({upstile}{slashbar}({upstile}V)) - ({downstile}{slashbar}({downstile}V))) 0)
Z{leftarrow}差分V
{lamp}计算向量之间的差值,使用空集保护
{lamp}差异通过从减少的地板中减去减少的天花板来计算
{lamp}例如({upstile}{slashbar}({upstile}V))-({downsttile}{slashbar}({downsttile}V))
{lamp}保护是通过与空集{zilde}{equalunderbar}V进行比较来实现的
{lamp}生成0或1,并使用该结果从元组中选择答案
{lamp}如果为空,则删除第一个元素,只产生一个零,否则两个元素都保留
{lamp}例如{向下箭头}(ab)=>0=(ab),1=(b)
{lamp}最后一个操作是第一个{uparrow},从元组中删除第一个元素。
Z{leftarrow}{uparrow}({zilde}{equalunderbar}V){downarow}((({upstile}{slashbar}({upstile}V))-({downstile}{slashbar}({downstile}V))0)
还有一个为了保存的形象

更新。多维

Z←差异V
⍝ 计算向量之间的差值,带空集保护
⍝ 首先登记向量,使其减少到一维
⍝ 如。∊v
⍝ 差额由减少的楼层减去减少的天花板计算
⍝ 例如(⌈/五) -(⌊/(五)
⍝ 通过与空集进行比较来实现保护⍬≡v
⍝ 这将产生0或1,并使用该结果从元组中选择答案
⍝ 如果为空,则删除第一个元素,只产生一个零,否则两者都保留
⍝ 如。↓(a b)=>0=(a b),1=(b)
⍝ 最后的手术是第一次↑, 从元组中删除第一个元素。
v←∊v
Z←↑(⍬≡(五)↓(((⌈/五) -(⌊/五) )0)

防护罩是最好的方法:

{0=⍴⍵:0 ⋄ (⌈/⍵)-⌊/⍵}
请注意,使用两个减速器,一个带有轴规格,实际上并不需要或正确。也就是说,如果您想让它处理任何维度的简单数组的所有元素,只需首先展开参数:

     {0=⍴⍵:0 ⋄ (⌈/⍵)-⌊/⍵},10 10 ⍴⍳100
99
或者对于任何结构或深度的数组,您可以使用“super ravel”:

请注意,quadML(迁移级别)必须设置为3,以确保epsilon是“超级ravel”

在矩阵上操作时,还应注意以下内容的等效性:

     ⌈⌿⌈/10 10 ⍴⍳100
99
     ⌈/⌈/10 10 ⍴⍳100
99
     ⌈/⌈⌿10 10 ⍴⍳100
99
     ⌈⌿⌈⌿10 10 ⍴⍳100
99   

在这种情况下,不需要使用带axis的reduction,这会模糊其意图,并且可能会更昂贵。最好把整件事都弄清楚。

您使用的是哪种APL实现?@Orbling,我使用的是Dyalog APLLOG,我相信Dyalog有守卫,请参阅
{rho}c=0
将检查是否为空。请注意关联性规则。APL函数总是右关联的,因此
⌈⌿(⌈/(c)-⌊⌿(⌊/c) 
解析为
⌈⌿((⌈/(c)-⌊⌿(⌊/c) )
@亲爱的,你要参加Dyalog APL比赛,对吗?你似乎没有自己思考这些问题。解决方案对空向量和一维向量都很有效,但对二维向量/矩阵无效,如何解决?它说等级错误如果你想让你的代码是维度不可知的,你可以使用
⌈/,V
而不是
⌈⌿(⌈五) 
。一元
将任意秩数组的内容展开(即展平或线性化或转换为向量)。@n是的,这将是一种更好的处理方法。试图不偏离老年退休金计划的理念。虽然我也没有想到。@Honey:使用ngn的检查应该有效,最好在对空进行测试之前解开向量。是的,在Dyalog APL中,他们似乎没有
(无限)和
(负无限)的概念,如中所述。我正在测试,我确实说过,在Dyalog APL中,最初警卫是一种方式。我添加了另一个选项,因为不是每个人都使用Dyalog(我不这么认为),而且守卫是特定于它的。
     {0=⍴⍵:0 ⋄ (⌈/⍵)-⌊/⍵}∊(1 2 3)(7 8 9 10)
9
     ⌈⌿⌈/10 10 ⍴⍳100
99
     ⌈/⌈/10 10 ⍴⍳100
99
     ⌈/⌈⌿10 10 ⍴⍳100
99
     ⌈⌿⌈⌿10 10 ⍴⍳100
99