COLOR(red){SIZE(25){ベクトル、行列、配列の一般化外積、一般化クロネッカー積}}

* ベクトル、行列、配列の(一般化)外積、クロネッカー積
* ベクトル、行列、配列の(一般化)外積、クロネッカー積 [#n68d547f]
注意:内部関数を用い高速である。

** 一般化外積 outer()、外積 %x%
** 一般化外積 outer()、外積 %x% [#j23c1220]
 
 書式
    (1) outer(X, Y, FUN="*", ...)  # 任意関数を用いた一般化外積
    (2) x %o% y  # outer(X, Y, FUN="*") の簡略形。いわゆる外積
 変数 
    X, Y  # ベクトル、行列、配列 (サイズは異なって良い)
    関数 FUN は2変数関数 FUN(x, y)。+,-,*,/ 等は二重引用符で囲む必要がある。
    ... は FUN に引き渡される任意追加引数
 出力
   行列、もしくは配列 Z
   Z[i1, i2, ..., j1, j2, ...] は FUN(X[i1, i2, ...], Y[j1, j2, ...] になる
   dim(Z)=c(dim(X), dim(Y))
   X, Y に dimnames があれば Z に引き継がれる。 

 > x <- 1:9
 > names(x) <- x  # x に dimnames を与える
 ## 掛け算表(x の dimnames を引き継いでいる) Z[i, j] = x[i]*x[j] 
 > x %o% x
    1  2  3  4  5  6  7  8  9
   1  2  3  4  5  6  7  8  9
 1 1  2  3  4  5  6  7  8  9
 2 2  4  6  8 10 12 14 16 18
 3 3  6  9 12 15 18 21 24 27
 4 4  8 12 16 20 24 28 32 36
 5 5 10 15 20 25 30 35 40 45
 6 6 12 18 24 30 36 42 48 54
 7 7 14 21 28 35 42 49 56 63
 8 8 16 24 32 40 48 56 64 72
 9 9 18 27 36 45 54 63 72 81

 > y <- 2:8
 > names(y) <- paste(y, ":", sep = "")  # y の dimnames
 > outer(y, x, "^")  # 冪乗表。 Z[i, j] = x[i]^y[j]
     1   2    3      4          5            6             7        8         9
 2: 2   4    8     16       32          64         128      256       512
 3: 3   9  27     81      243       729       2187     6561     19683
 4: 4 16  64   256    1024     4096     16384    65536    262144
 5: 5 25 125  625    3125   15625     78125   390625   1953125
 6: 6 36 216 1296   7776   46656   279936  1679616  10077696
 7: 7 49 343 2401 16807 117649   823543  5764801  40353607
    1  2   3    4     5      6       7        8         9
 2: 2  4   8   16    32     64     128      256       512
 3: 3  9  27   81   243    729    2187     6561     19683
 4: 4 16  64  256  1024   4096   16384    65536    262144
 5: 5 25 125  625  3125  15625   78125   390625   1953125
 6: 6 36 216 1296  7776  46656  279936  1679616  10077696
 7: 7 49 343 2401 16807 117649  823543  5764801  40353607
 8: 8 64 512 4096 32768 262144 2097152 16777216 134217728

 # 文字列の paste 
 > outer(month.abb, 1999:2003, FUN = "paste")
        [,1]       [,2]       [,3]       [,4]       [,5]
  [1,] "Jan 1999" "Jan 2000"  "Jan 2001"  "Jan 2002"   "Jan 2003"
  [2,] "Feb 1999" "Feb 2000"  "Feb 2001"  "Feb 2002"   "Feb 2003"
  [3,] "Mar 1999" "Mar 2000"  "Mar 2001" "Mar 2002"  "Mar 2003"
  [4,] "Apr  1999" "Apr 2000"  "Apr 2001"  "Apr 2002"   "Apr 2003"
       [,1]       [,2]       [,3]       [,4]       [,5]      
  [1,] "Jan 1999" "Jan 2000" "Jan 2001" "Jan 2002" "Jan 2003"
  [2,] "Feb 1999" "Feb 2000" "Feb 2001" "Feb 2002" "Feb 2003"
  [3,] "Mar 1999" "Mar 2000" "Mar 2001" "Mar 2002" "Mar 2003"
  [4,] "Apr 1999" "Apr 2000" "Apr 2001" "Apr 2002" "Apr 2003"
  [5,] "May 1999" "May 2000" "May 2001" "May 2002" "May 2003"
  [6,] "Jun 1999" "Jun 2000"   "Jun 2001"   "Jun 2002"  "Jun 2003"
  [7,] "Jul  1999" "Jul 2000"    "Jul 2001"    "Jul 2002"   "Jul 2003"
  [8,] "Aug 1999" "Aug 2000" "Aug 2001"   "Aug 2002" "Aug 2003"
  [6,] "Jun 1999" "Jun 2000" "Jun 2001" "Jun 2002" "Jun 2003"
  [7,] "Jul 1999" "Jul 2000" "Jul 2001" "Jul 2002" "Jul 2003"
  [8,] "Aug 1999" "Aug 2000" "Aug 2001" "Aug 2002" "Aug 2003"
  [9,] "Sep 1999" "Sep 2000" "Sep 2001" "Sep 2002" "Sep 2003"
 [10,] "Oct 1999" "Oct 2000" "Oct 2001" "Oct 2002" "Oct 2003"
 [11,] "Nov 1999" "Nov 2000" "Nov 2001" "Nov 2002" "Nov 2003"
 [12,] "Dec 1999" "Dec 2000" "Dec 2001" "Dec 2002" "Dec 2003"

 # dim(Z) = c(9,9,3)。Z[i, j, k] = x[i]*x[j]*y[k] になる 
 > x %o% x %o% y[1:3]

** 配列の一般化クロネッカー積 kronecker()
** 配列の一般化クロネッカー積 kronecker() [#v1c386a5]

 書式
    (1)   kronecker(X, Y, FUN = "*", make.dimnames = FALSE, ...)
    (2)  X %x% Y  #通常のクロネッカー積 (kronecker(X, Y) に等しい)
 引数
    X, Y: 配列
    make.dimnames = TRUE なら X,Y の dimanames が引き継がれる
    FUN: 成分の合成に使われる二変数関数。+,-,*,/ 等は二重引用符で囲む必要がある
    ... : FUN に引き渡される追加の任意引数 
 結果
    Z=kronecker(X, Y, ...) は dim(Z)=dim(X)*dim(Y) 
    Z は小行列 FUN(X[i1, i2, ...], Y[j1, j2, ...], ...) を並べた大きな配列 
 注意:もし X, Y の dim が異なれば、小さい配列はサイズ 1 の次元を追加される

 > (M <- matrix(1:6, ncol = 2))  # 3x2 行列
      [,1] [,2]
 [1,]    1    4
 [2,]    2    5
 [3,]    3    6
 > kronecker(4, M)  # 単にスカラー倍 4*M
       [,1] [,2]
 [1,]    4   16
 [2,]    8   20
 [3,]   12   24
 > kronecker(diag(1, 3), M)  # M を対角状に並べた行列
       [,1] [,2] [,3] [,4] [,5] [,6]    # dim = c(3,3)*c(3,2) = c(9, 6)
 [1,]    1    4    0    0    0    0
 [2,]    2    5    0    0    0    0
 [3,]    3    6    0    0    0    0
 [4,]    0    0    1    4    0    0
 [5,]    0    0    2    5    0    0
 [6,]    0    0    3    6    0    0
 [7,]    0    0    0    0    1    4
 [8,]    0    0    0    0    2    5
 [9,]    0    0    0    0    3    6

 > fred <- matrix(1:12, 3, 4, dimnames = list(LETTERS[1:3], LETTERS[4:7]))
 > bill <- c(happy = 100, sad = 1000)
 > kronecker(fred, bill, make.dimnames = TRUE)
                  D:      E:      F:        G:
 A:happy  100   400   700   1000   # dimnames を引き継いでいる
 A:sad    1000 4000 7000 10000   # dim = c(3,4)*c(2,1) = c(6,4)
 B:happy  200   500   800   1100
 B:sad    2000 5000 8000 11000
 C:happy  300   600   900   1200
 C:sad   3000 6000  9000 12000
           D:   E:   F:    G:
 A:happy  100  400  700  1000   # dimnames を引き継いでいる
 A:sad   1000 4000 7000 10000   # dim = c(3,4)*c(2,1) = c(6,4)
 B:happy  200  500  800  1100
 B:sad   2000 5000 8000 11000
 C:happy  300  600  900  1200
 C:sad   3000 6000 9000 12000

 > bill <- outer(bill, c(cat = 3, dog = 4))
 > bill
              cat   dog
 happy  300   400
 sad    3000 4000
 > kronecker(fred, bill, make.dimnames = TRUE)  # dimanmes 自身が合成されていることを注意!
               D:cat D:dog   E:cat    E:dog   F:cat  F:dog   G:cat  G:dog
 A:happy   300    400   1200     1600   2100   2800   3000   4000
 A:sad     3000  4000  12000  16000 21000 28000 30000 40000
 B:happy   600    800    1500    2000   2400   3200   3300   4400
 B:sad     6000  8000  15000  20000 24000 32000 33000 44000
 C:happy   900  1200    1800    2400   2700   3600   3600   4800
 C:sad     9000 12000  18000 24000 27000 36000 36000 48000
        cat  dog
 happy  300  400
 sad   3000 4000
 > kronecker(fred, bill, make.dimnames = TRUE)  # dimanmes 自身が合成されていることに注意!
         D:cat D:dog E:cat E:dog F:cat F:dog G:cat G:dog
 A:happy   300   400  1200  1600  2100  2800  3000  4000
 A:sad    3000  4000 12000 16000 21000 28000 30000 40000
 B:happy   600   800  1500  2000  2400  3200  3300  4400
 B:sad    6000  8000 15000 20000 24000 32000 33000 44000
 C:happy   900  1200  1800  2400  2700  3600  3600  4800
 C:sad    9000 12000 18000 24000 27000 36000 36000 48000



トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS