ベクトル、行列、配列の一般化外積、一般化クロネッカー積

ベクトル、行列、配列の(一般化)外積、クロネッカー積

注意:内部関数を用い高速である。

一般化外積 outer()、外積 %x%

書式
   (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 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
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"
 [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"
 [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()

書式
   (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
> 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

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-03-25 (土) 11:19:17