> x <- c(1,1)
> m <- rbind(c(1,4),c(2,2))
> m %*% x # 1
[,1]
[1,] 5
[2,] 4
> x %*% m # 2
[,1] [,2]
[1,] 3 6
>
我能理解第二次乘法的工作原理和原因.在数学中,1×2(1行,2列)矩阵可以乘以2×2矩阵.
但为什么第一个工作起作用,为什么它根本不产生错误或警告?在数学中,2×2矩阵不能乘以1×2向量/矩阵.
请注意,如果我像下面这样初始化x,并且如果我然后将m乘以x,我得到与上面第一个例子中相同的结果.
> x <- cbind(c(1,1));
> x
[,1]
[1,] 1
[2,] 1
> m %*% x # 3
[,1]
[1,] 5
[2,] 4
所以我认为第三个例子是正确的方法.
那么为什么第一个例子没有错误或警告就能正常工作?
最佳答案 直接来自文档,?matmult:
matmult {base}
如果它们是一致的,则将两个矩阵相乘.如果一个参数是一个向量,它将被提升为行或列矩阵,以使两个参数一致.如果两者都是相同长度的向量,它将返回内积(作为矩阵).
所以以下内容相同(忽略属性):
x %*% m
t(x) %*% m
rbind(x) %*% m
并以同样的方式:
m %*% x
m %*% t(t(x))
m %*% cbind(x)
但是m%*%t(x)或t(t(x))%*%m会给你一个错误,因为t()将返回一个矩阵,现在维度不兼容.这也说明了矢量被更好地解释为列而不是行向量.