2013-04-22 2 views
1

В R, я хочу умножить вектор 1x3 на матрицу 3x3, чтобы создать вектор 1x3. Однако R возвращает матрицу:Умножьте вектор по матрице в 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 

Правильный вывод должен быть вектор, а не матрица

+4

Вы попробовали 'v% *% m' – Nishanth

+0

Я этого не пробовал! никогда не видел этого раньше. но это работает, спасибо! вы должны написать ответ, тогда я приму его, потому что вы сначала ответили. – CodeGuy

+0

То нормально. Вы можете принять любой из этих ответов. – Nishanth

ответ

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). 
+1

'as.vector()' является ложным. –

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> 
3

Полезные функции в данном случае являются crossprod и tcrossprod

> tcrossprod(v, m) 
    [,1] [,2] [,3] 
[1,] 3 4 4 

См ?crossprod и ?tcrossprod для деталей.

Смежные вопросы