我觉得R中的矩阵运算非常混乱:我们正在混合行和列向量。
这里我们将x1
定义为向量,(我假设R默认向量是一个列向量?但它没有显示它以这种方式排列。)
然后我们定义x2
是x1
的转置,显示对我来说也很奇怪。
最后,如果我们将x3
定义为矩阵,则显示效果会更好。
现在,我的问题是,x1
和x2
是完全不同的东西(一个是另一个的转置),但我们在这里有相同的结果。
有任何解释吗?可能我不应该将矢量和矩阵运算混合在一起吗?
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
答案 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.