2
Suppose I have a matrix

一个=

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

我想要A的每一行和另一个矩阵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 循环的情况下,是否有更优化的方法?

4

3 回答 3

3

以下三个解决方案是等效的并提供相同的结果;但是它们在性能上是不同的。我确实在10000迭代循环中运行了它们以比较它们的平均性能,结果如下:

1-

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

时间:0.46

2-

apply(A,1,crossprod,B)

时间:0.58

3-

t(A %*% B)

或者

t(tcrossprod(A,B))

时间:0.08

于 2013-03-02T05:42:18.877 回答
1

没有真正优化,但看起来更好,

apply(A,1,crossprod,B)
于 2013-03-02T05:21:44.497 回答
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
于 2013-03-02T05:26:15.987 回答