4

⌈⌿(⌈/c)- ⌊⌿(⌊/c) を使用して空のベクトル (v←⍳0) の最大数と最小数の差を計算すると、ドメイン エラーが発生します。このステートメントは、法線ベクトルと行列で正常に機能します。

ベクトルが空のときにエラーが発生しないように例外を処理するにはどうすればよいですか? 何も返さないか、単にゼロを返す必要があります。

4

2 に答える 2

2

ガードはこれを行うための最良の方法です。

{0=⍴⍵:0 ⋄ (⌈/⍵)-⌊/⍵}

2 つのリダクション (1 つは軸指定) を使用することは、実際には必要ではなく、実際には正しくないことに注意してください。つまり、任意の次元の単純な配列のすべての要素に対して機能させたい場合は、最初に引数を単純に分解します。

     {0=⍴⍵:0 ⋄ (⌈/⍵)-⌊/⍵},10 10 ⍴⍳100
99

または、任意の構造または深さの配列については、「super ravel」を使用できます。

     {0=⍴⍵:0 ⋄ (⌈/⍵)-⌊/⍵}∊(1 2 3)(7 8 9 10)
9

イプシロンが「スーパーラベル」であることを確認するには、quadML (移行レベル) を 3 に設定する必要があることに注意してください。

マトリックスを操作する場合は、次の同等性にも注意してください。

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

この場合、軸でリダクションを使用する必要はなく、意図が不明瞭になり、コストが高くなる可能性もあります。全体をほぐしたほうがいいです。

于 2013-05-29T20:28:25.643 に答える
1

コメントで述べたように、Dyalog APL にはguardsがあり、条件付き実行に使用できるため、空のベクトルを簡単にチェックして別の答えを出すことができます。

ただし、これはより伝統的/純粋な APL メソッドで実装できます。

このバージョンは 1 次元でのみ機能します

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{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)

そして保存用の画像…

APL差関数

更新しました。多次元

Z←DIFFERENCE V
⍝ Calculate difference between vectors, with empty set protection
⍝ Initially enlist the vector to get reduce to single dimension
⍝ eg. ∊V
⍝ 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.
V←∊V
Z←↑(⍬≡V)↓(((⌈/V) - (⌊/V)) 0)

APL 違い多次元

于 2013-05-29T18:04:53.913 に答える