在R中,我想将1x3向量乘以3x3矩阵以产生1x3向量。但是R返回一个矩阵:
> v = c(1,1,0)
> m = matrix(c(1,2,1,3,1,1,2,2,1),nrow=3,ncol=3,byrow=T)
> v*m
[,1] [,2] [,3]
[1,] 1 2 1
[2,] 3 1 1
[3,] 0 0 0
正确的输出应该是矢量,而不是矩阵
答案 0 :(得分:5)
如有疑问,请尝试使用帮助系统,例如help("*")
或help("Arithmetic")
。你只是使用了错误的操作符。
R> v <- c(1,1,0)
R> m <- matrix(c(1,2,1,3,1,1,2,2,1),nrow=3,ncol=3,byrow=T)
R> dim(m)
[1] 3 3
R> dim(v)
NULL
R> dim(as.vector(v))
NULL
R> dim(as.matrix(v, ncol=1))
[1] 3 1
R>
R> m %*% as.matrix(v, ncol=1)
[,1]
[1,] 3
[2,] 4
[3,] 4
R>
请注意,我们必须先将v
转换为正确的向量。你没有说它是1x3还是3x1。但幸运的是R很慷慨:
R> v %*% m
[,1] [,2] [,3]
[1,] 4 3 2
R> m %*% v
[,1]
[1,] 3
[2,] 4
[3,] 4
R>
答案 1 :(得分:3)
在这种情况下,有用的功能是crossprod
和tcrossprod
> tcrossprod(v, m)
[,1] [,2] [,3]
[1,] 3 4 4
有关详细信息,请参阅?crossprod
和?tcrossprod
。
答案 2 :(得分:2)
您在寻找
吗?as.vector(v %*% m)
这里是matmult
的文档:
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 it
will return the inner product (as a matrix).