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循环的情况下,是否有更优化的方法?
答案 0 :(得分: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
答案 1 :(得分:1)
不是更优化,但看起来更好,
apply(A,1,crossprod,B)
答案 2 :(得分: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