配列の外積、クロネッカー積
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
COLOR(red){SIZE(25){ベクトル、行列、配列の一般化外積、一般化クロネッカー積}}
* ベクトル、行列、配列の(一般化)外積、クロネッカー積 [#n68d547f]
注意:内部関数を用い高速である。
** 一般化外積 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 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() [#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
> 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
終了行:
COLOR(red){SIZE(25){ベクトル、行列、配列の一般化外積、一般化クロネッカー積}}
* ベクトル、行列、配列の(一般化)外積、クロネッカー積 [#n68d547f]
注意:内部関数を用い高速である。
** 一般化外積 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 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() [#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
> 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
ページ名: