R中的矩阵和向量乘法运算

时间:2016-08-18 19:14:50

标签: r matrix vector matrix-multiplication

我觉得R中的矩阵运算非常混乱:我们正在混合行和列向量。

  • 这里我们将x1定义为向量,(我假设R默认向量是一个列向量?但它没有显示它以这种方式排列。)

  • 然后我们定义x2x1的转置,显示对我来说也很奇怪。

  • 最后,如果我们将x3定义为矩阵,则显示效果会更好。

现在,我的问题是,x1x2是完全不同的东西(一个是另一个的转置),但我们在这里有相同的结果。

有任何解释吗?可能我不应该将矢量和矩阵运算混合在一起吗?

x1 = c(1:3)
x2 = t(x1)
x3 = matrix(c(1:3), ncol = 1)

x1
[1] 1 2 3

x2
     [,1] [,2] [,3]
[1,]    1    2    3

x3
     [,1]
[1,]    1
[2,]    2
[3,]    3

x3 %*% x1
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    4    6
[3,]    3    6    9

x3 %*% x2
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    4    6
[3,]    3    6    9

3 个答案:

答案 0 :(得分:4)

请参阅?`%*%`

  

说明

 Multiplies two matrices, if they are conformable.  If one argument
 is a vector, it will be promoted to either a row or column matrix
 to make the two arguments conformable.  If both are vectors of the
 same length, it will return the inner product (as a matrix).

答案 1 :(得分:4)

长度为3的数字向量不是“列向量”,因为它没有维度。但是,它确实由%*%处理,就好像它是一个维度为1 x 3的矩阵,因为这成功了:

 x <- 1:3
 A <- matrix(1:12, 3)
 x %*% A
#------------------
     [,1] [,2] [,3] [,4]
[1,]   14   32   50   68
#----also----
 crossprod(x,A)   # which is actually t(x) %*% A (surprisingly successful)

     [,1] [,2] [,3] [,4]
[1,]   14   32   50   68

这不是:

 A %*% x
#Error in A %*% x : non-conformable arguments

在与尺寸为n x 1矩阵的矩阵相同的基础上处理原子向量是有意义的,因为R使用列主索引处理其矩阵运算。 R关联规则从左到右进行,所以这也成功了:

  y <- 1:4
 x %*% A %*% y
#--------------    
 [,1]
[1,]  500

请注意as.matrix遵守此规则:

> as.matrix(x)
     [,1]
[1,]    1
[2,]    2
[3,]    3

我认为您应该阅读?crossprod帮助页面,了解更多详情和背景信息。

答案 2 :(得分:1)

尝试以下

library(optimbase)
x1 = c(1:3)
x2 = transpose(x1)

x2
     [,1]
[1,]    1
[2,]    2
[3,]    3

相反:

x2.t = t(x1)
x2.t
     [,1] [,2] [,3]
[1,]    1    2    3

请参阅transpose

的文档
  

transpose is a wrapper function around the t function, which tranposes matrices. Contrary to t, transpose processes vectors as if they were row matrices.