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ループを使用せずにこれを行うためのより最適化された方法はありますか?

4

3 に答える 3

3

以下の3つのソリューションは同等であり、同じ結果を提供します。ただし、パフォーマンスは異なります。それらを反復のループで10000実行して、平均パフォーマンスを比較しました。結果は次のとおりです。

1-

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

時間:0.46

2-2-

apply(A,1,crossprod,B)

時間:0.58

3-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 に答える