4

私は2x3の配列を持っています

a =. 2 3 $  2 3
   a
2 3 2
3 2 3

+/ を使用してすべての要素を合計して 15 を取得します。

そう

+/a
5 5 5

うーん。これは明らかに列を追加しています。+/ ランクが _ _ _ (つまり、無限大) であり、a がランク 2 であることはわかっています。残念ながら、これを解釈して列を追加する理由を想像することはできません。(「J for C Programmers」を読んでいます)

だからただの楽しみのために私はやった:

+/"1 a
7 8

これで、行が追加されます。明らかに、+/ のランクを 1 に変更しました。これは 2 (a のランク) 未満です。つまり、わかりません。フォームの無限を 1 に切り替えて行を追加するのはなぜですか?

どうですか

+/"0 a
2 3 2
3 2 3

したがって、何もない単一のセルを追加するだけなので、元の a に等しい配列が得られます。ここでも、理由はわかりませんが、ここにたどり着くまでに引数をごちゃまぜにすることはできます。すなわち。各セルを順番に個別に追加します。

そして運のためにもう一度:

+/"2 a
5 5 5

また、列を追加しています。動詞のランクが変更されたときに追加される行/列/セルを選択するメカニズムがわかりません。列を追加していますが、私の見解では、行を追加するのと同じくらい簡単です。

できればこれを説明してほしい。私が言ったように、私はいくつかの文献を読んでいますが、それでも難しいと感じています.

4

2 に答える 2

4

n配列がある場合、適切なランクを使用して各ネスト「レベル」にアクセスできます。

名詞のランク/形

最初に原子があります(ランク0):

a =: 1

それらの形状($a)は空です。

次に、リスト(ランク1)があります。これは、いくつかのアトムをまとめたものです。

b =: a,a,a
b =: 3 # a
b =: 3 $ a

それらの形状($b)はリストの長さです。

$b
3

次に、テーブル(ランク2):リストをまとめたもの(スティッチまたはその他):

c =: b,.b,.b

それらの形状は、行、列の2項目のリストです。

$c
3 3

次に、ランクnまでの配列(ランクn)。

動詞のランク

動詞のランクは多少異なります。動詞が適用されるランクです。したがって、名詞をボックス0(<"0)にすると、常にこの名詞のアトムをボックスに入れ、ボックス-1(<"1)にすると、名詞のリストなどを常にボックスに入れます。例:

 ]n =: 2 3 4 $ i.24
 0  1  2  3
 4  5  6  7
 8  9 10 11

12 13 14 15
16 17 18 19
20 21 22 23

0ランク:

<"0 n
┌──┬──┬──┬──┐
│0 │1 │2 │3 │
├──┼──┼──┼──┤
│4 │5 │6 │7 │
├──┼──┼──┼──┤
│8 │9 │10│11│
└──┴──┴──┴──┘

┌──┬──┬──┬──┐
│12│13│14│15│
├──┼──┼──┼──┤
│16│17│18│19│
├──┼──┼──┼──┤
│20│21│22│23│
└──┴──┴──┴──┘

1ランク:

  <"1 n
┌───────────┬───────────┬───────────┐
│0 1 2 3    │4 5 6 7    │8 9 10 11  │
├───────────┼───────────┼───────────┤
│12 13 14 15│16 17 18 19│20 21 22 23│
└───────────┴───────────┴───────────┘

2ランク:

 <"2 n
┌─────────┬───────────┐
│0 1  2  3│12 13 14 15│
│4 5  6  7│16 17 18 19│
│8 9 10 11│20 21 22 23│
└─────────┴───────────┘

3ランク:

 <"3 n
┌───────────┐
│ 0  1  2  3│
│ 4  5  6  7│
│ 8  9 10 11│
│           │
│12 13 14 15│
│16 17 18 19│
│20 21 22 23│
└───────────┘

この例では、3より高いランクは3と同じです。

負のランクを使用することもできます。これは、最高ランクから逆方向にカウントされます。

ランクを混在させることもできます。

合計

+/のランクを変更すると、合計の結果がどのように変化するかがわかります。たとえば、+/"1すべてのランク1リストを合計します。

    <"1 n
┌───────────┬───────────┬───────────┐
│0 1 2 3    │4 5 6 7    │8 9 10 11  │
├───────────┼───────────┼───────────┤
│12 13 14 15│16 17 18 19│20 21 22 23│
└───────────┴───────────┴───────────┘
   +/"1 n
 6 22 38
54 70 86

ランクn配列を合計するには、nsを実行する必要があります+/

(+/^:3) n
276
+/+/+/ n
276

,または、合計する前に配列を解く()ことができます。

+/,n
276
于 2012-08-24T18:28:28.213 に答える
2

フレーズ+/"1および+/は行列の行と列に作用するように見えますが、これはそれらが何をするかの正確な説明ではなく、ランクの概念の単純さと力を実際に理解するのに役立ちません.

フレーズを理解することから始めましょう+/(ここではモナド形式、つまり正しい引数のみに限定します)。この句は/、動詞を左に移動する副詞 (この場合は ) で構成され+、右引数の項目の間に挿入されます。リスト/ベクトルの項目はリスト内の数値/アトムであるため、+/ 3 4 5 6実際には3 + 4 + 5 + 6. テーブル/マトリックス (ランク 2) の項目はその行 (ランク 1) であり、ランク 3 配列の項目はそのテーブル (ランク 2) です。

   ]a=: i. 2 3
0 1 2         NB. 1st item of a
3 4 5         NB. 2nd item of a

   ]b=: i. 2 3 4 
 0  1  2  3
 4  5  6  7   NB. 1st item of b
 8  9 10 11

12 13 14 15
16 17 18 19   NB. 2nd item of b
20 21 22 23

その右の引数のアイテム間の+/挿入を覚えておいてください:+

   +/ i. 2 3
3 5 7   

基本的には次のとおりです。

   0 1 2 + 3 4 5
3 5 7

と:

   +/ i. 2 3 4
12 14 16 18
20 22 24 26
28 30 32 34

2 つの行列を加算するだけです

   (i. 3 4) + (12 + i. 3 4)
12 14 16 18
20 22 24 26
28 30 32 34

では、ランク結合はどのよう"に適合するのでしょうか? それについて考える最も簡単な方法は、一度に動詞に与えられる正しい引数のチャンクの大きさを制御するために使用できることです。+/"1は と同じですが、右の引数は一度にリスト/ベクター/行に+/のみ供給されます。+/そう:

   +/"1 i. 2 3

i. 2 3行列を一度に 1 行ずつフィードします+/+/次に、行の項目の間に を挿入し+、式を評価してから次のチャンクに進み、各チャンクの結果を一緒に追加します。つまり、実際の計算は次のようになります

   +/"1 i. 2 3 -->
   (+/ 0 1 2) , (+/ 3 4 5) -->
   (0 + 1 + 2) , (3 + 4 + 5)
3 12

   +/"1 i. 2 3 4   NB. Feed right arg to +/ a row-at-a-time
 6 22 38           NB. + inserted between items of each row
54 70 86           NB. result has row for each item (matrix) in original argument

   +/"2 i. 2 3 4   NB. feed right arg to +/ a table/matrix-at-a-time
12 15 18 21        NB. + inserted between rows of each matrix
48 51 54 57

   +/"0 i. 2 3 4   NB. feed right arg to +/ an atom at a time
0  1  2  3         NB. this is essentially an identity function because
4  5  6  7         NB. the sum of a number is itself: (+/ 3) is just 3.
8  9 10 11

12 13 14 15
16 17 18 19
20 21 22 23
于 2012-08-26T10:45:18.070 に答える