2013-03-02 80 views
2
Suppose I have a matrix 

A =交叉产物

 [1, 2, 3; 
     4, 5, 6; 
     7, 8, 9; 
     8, 7, 6]; 

我想A的各行和另一矩阵B的叉积,其中

B =

 [1, 0.5, 0.5; 
     0.5, 1, 0.5; 
     0.5, 0.5, 1]; 

for循环可以写成,

for(i in 1:4) 
{ 
     t(A[i,])%*%B; 
} 

有没有更好的方式做到这一点,而不使用for循环?

回答

3

以下解决方案三者是等价的,并提供相同的结果;然而他们在表现上有所不同。我并运行它们在10000迭代循环来比较它们的平均表现,在这里是结果:

1-

for(i in 1:4) 
{ 
    t(A[i,])%*%B; 
} 

时间:0.46

2-

apply(A,1,crossprod,B) 

Time:0.58

3-

​​3210

t(tcrossprod(A,B)) 

时间:0.08

+0

谢谢!它帮助了很多! – user2096864 2013-03-02 06:43:39

+0

用于bechmarking – 2013-03-02 17:38:03

1

不是真的更优化,但它看起来更好,

apply(A,1,crossprod,B) 
1

R已经内置的功能是:

A %*% B 
    #  [,1] [,2] [,3] 
    # [1,] 3.5 4 4.5 
    # [2,] 9.5 10 10.5 
    # [3,] 15.5 16 16.5 
    # [4,] 14.5 14 13.5