ベクトル、行列、配列の一般化外積、一般化クロネッカー積
注意:内部関数を用い高速である。
書式 (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]
書式 (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