The outer product of the arrays, 矩阵外积, or 矩阵特定外函数

矩阵外积使用%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%")
上一篇:一个简单的网址大全1.1.0(C++)


下一篇:Linux TCP 系统参数配置