矩阵外积使用%o%运算符计算.
得到结果为维度相加的数组.
例如 :
一个2维矩阵和一个3维数组计算外积, 将得到一个5维数组.
> x <- matrix(1:10, 2, 5)
> y <- array(1:64, dim=c(4,4,4))
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> y
, , 1
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
, , 2
[,1] [,2] [,3] [,4]
[1,] 17 21 25 29
[2,] 18 22 26 30
[3,] 19 23 27 31
[4,] 20 24 28 32
, , 3
[,1] [,2] [,3] [,4]
[1,] 33 37 41 45
[2,] 34 38 42 46
[3,] 35 39 43 47
[4,] 36 40 44 48
, , 4
[,1] [,2] [,3] [,4]
[1,] 49 53 57 61
[2,] 50 54 58 62
[3,] 51 55 59 63
[4,] 52 56 60 64
计算外积 :
> x %o% y
, , 1, 1, 1
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
, , 2, 1, 1
[,1] [,2] [,3] [,4] [,5]
[1,] 2 6 10 14 18
[2,] 4 8 12 16 20
....
结果略.
外积计算结果的维度和类型 :
> dim(x %o% y)
[1] 2 5 4 4 4
> class(x %o% y)
[1] "array"
我们看到一个(2,5)的矩阵和一个(4,4,4)的数组计算外积得到了一个(2,5,4,4,4)的数组.
下面来看一下外积是怎么计算的, 使用小一点的矩阵.
> x <- matrix(1:4, 2, 2)
> y <- matrix(10:13, 1, 4)
> x
[,1] [,2]
[1,] 1 3
[2,] 2 4
> y
[,1] [,2] [,3] [,4]
[1,] 10 11 12 13
使用x %o% y计算外积, 相当于y的每个元素和x相乘.
> x %o% y
y的第1个元素(1,1)乘以x
, , 1, 1
[,1] [,2]
[1,] 10 30
[2,] 20 40
y的第2个元素(1,2)乘以x
, , 1, 2
[,1] [,2]
[1,] 11 33
[2,] 22 44
y的第3个元素(1,3)乘以x
, , 1, 3
[,1] [,2]
[1,] 12 36
[2,] 24 48
y的第4个元素(1,4)乘以x
, , 1, 4
[,1] [,2]
[1,] 13 39
[2,] 26 52
反过来写 y %o% x
x的第1个元素(1,1)乘以y
> y %o% x
, , 1, 1
[,1] [,2] [,3] [,4]
[1,] 10 11 12 13
x的第2个元素(2,1)乘以y
, , 2, 1
[,1] [,2] [,3] [,4]
[1,] 20 22 24 26
x的第3个元素(1,2)乘以y
, , 1, 2
[,1] [,2] [,3] [,4]
[1,] 30 33 36 39
x的第4个元素(2,2)乘以y
, , 2, 2
[,1] [,2] [,3] [,4]
[1,] 40 44 48 52
%o%实际是outer函数的一种特殊用法. 即FUN为乘法.
outer(X, Y, FUN = "*", ...)
X %o% Y
例如
> outer(y,x,FUN="*")
, , 1, 1
[,1] [,2] [,3] [,4]
[1,] 10 11 12 13
, , 2, 1
[,1] [,2] [,3] [,4]
[1,] 20 22 24 26
, , 1, 2
[,1] [,2] [,3] [,4]
[1,] 30 33 36 39
, , 2, 2
[,1] [,2] [,3] [,4]
[1,] 40 44 48 52
如果我们把FUN换成加法, 结果如下 :
> outer(y,x,FUN="+")
, , 1, 1
[,1] [,2] [,3] [,4]
[1,] 11 12 13 14
, , 2, 1
[,1] [,2] [,3] [,4]
[1,] 12 13 14 15
, , 1, 2
[,1] [,2] [,3] [,4]
[1,] 13 14 15 16
, , 2, 2
[,1] [,2] [,3] [,4]
[1,] 14 15 16 17
FUN还可以使用自定义函数, 以及函数支持传入参数等.
[参考]
1. help(outer)
2. help("%o%")
时间: 2024-10-30 21:19:44