2013-07-18 39 views
5

Tôi biết đây là một câu hỏi thực sự cơ bản, xin lỗi.Cách tốt để nhân mỗi hàng của ma trận bằng một vectơ trong r

Tôi muốn nhân mỗi hàng của ma trận bằng vectơ. Vì vậy, tôi có:

mat=matrix(1,2,4) 
vec=c(1,2,3,4) 

#works but ugly: 
new.mat=mat 
for(i in 1:nrow(mat)){ 
    new.mat[i,]=mat[i,]*vec 
} 

Tôi nghĩ tôi đã tìm thấy câu trả lời bằng 'áp dụng' nhưng tôi không thể làm cho nó hoạt động theo cùng một cách.

Trả lời

11

Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm ...

t(t(mat) * vec) 
    [,1] [,2] [,3] [,4] 
[1,] 1 2 3 4 
[2,] 1 2 3 4 

* giống như hầu hết các nhà khai thác khác trong R được vectorised. Các t là cần thiết vì R sẽ tái chế cột-khôn ngoan. Các giải pháp apply là:

t(apply(mat , 1 , `*` , vec)) 
    [,1] [,2] [,3] [,4] 
[1,] 1 2 3 4 
[2,] 1 2 3 4 
+0

Hoàn hảo, cảm ơn bạn –

+0

@JessicaB bạn được hoan nghênh! :-) –

3

sử dụng apply

> t(apply(mat,1 , function(x) x*vec)) 
    [,1] [,2] [,3] [,4] 
[1,] 1 2 3 4 
[2,] 1 2 3 4 
+0

Cách rất thanh lịch, như Simon. Tôi upvoted của bạn bởi vì tôi thích các chức năng được chứa trong một phần duy nhất thay vì được tách bởi một dấu phẩy –

2

tôi phải nói một cách thanh lịch nhất để đi về việc này là:

mat=matrix(1,2,4) 
vec=1:4 
new.mat=t(vec*t(mat)) 
1

tôi thích sweep, mặc dù tôi nghĩ rằng nó hơi chậm hơn:

sweep(mat,MARGIN=2,vec,"*") 

MARGIN=2 chỉ định rằng mỗi cột (lề 2) phải được nhân với phần tử tương ứng là vec.

Các vấn đề liên quan