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