问题
I feel matrix operations in R is very confusing: we are mixing row and column vectors.
Here we define
x1
as a vector, (I assume R default vector is a column vector? but it does not show it is arranged in that way.)Then we define
x2
is a transpose ofx1
, which the display also seems strange for me.Finally, if we define
x3
as a matrix the display seems better.
Now, my question is that, x1
and x2
are completely different things (one is transpose of another), but we have the same results here.
Any explanations? may be I should not mix vector and matrix operations together?
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
回答1:
See ?`%*%`
:
Description:
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).
回答2:
A numeric vector of length 3 is NOT a "column vector" in the sense that it does not have a dimension. However, it does get handled by %*% as though it were a matrix of dimension 1 x 3 since this succeeds:
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
And this does not:
A %*% x
#Error in A %*% x : non-conformable arguments
Treating an atomic vector on the same footing as a matrix of dimension n x 1 matrix makes sense because R handles its matrix operations with column-major indexing. And R associativity rules proceed from left to right, so this also succeeds:
y <- 1:4
x %*% A %*% y
#--------------
[,1]
[1,] 500
Note that as.matrix
obeys this rule:
> as.matrix(x)
[,1]
[1,] 1
[2,] 2
[3,] 3
I think you should read the ?crossprod
help page for a few more details and background.
回答3:
Try the following
library(optimbase)
x1 = c(1:3)
x2 = transpose(x1)
x2
[,1]
[1,] 1
[2,] 2
[3,] 3
As opposed to:
x2.t = t(x1)
x2.t
[,1] [,2] [,3]
[1,] 1 2 3
See documentation of 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.
来源:https://stackoverflow.com/questions/39025900/matrix-and-vector-multiplication-operation-in-r