避免for循环

时间:2017-08-03 21:15:19

标签: r encoding

我想计算矩阵x的每一行与其自身之间的乘积。然后总结所有这些产品的结果。结果是标量。我制作以下可用但不高效的尾声。有人可以帮我避免for循环吗?

for(i in 1:nrow(x){
   resid2[i] <- t(x[i,])%*% x[i,]
  }
  V = sum(resid2)/

3 个答案:

答案 0 :(得分:2)

解决方案只是矩阵中所有元素的平方和。

V = sum(x^2)

也可以通过矩阵乘法计算:

V = crossprod(as.vector(x))

中间向量resid2可以计算为

resid2 = rowSums(x^2)
V = sum(resid2)

答案 1 :(得分:1)

以下是为apply系列交换for循环的答案。

sum(apply(x, margin = 1, function(z) z%*%z))

apply函数采用矩阵xmargin = 1表示每行(与margin = 2相对,这意味着每列)。因此,对于x中的每一行,运行一个将该行与自身相乘的函数:function(z) z%*%z

答案 2 :(得分:0)

如果我理解正确,你根本不需要循环。 mat %*% mat应该这样做:

mat <- matrix(seq.int(9), nrow=3)

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

mat %*% mat
##      [,1] [,2] [,3]
## [1,]   30   66  102
## [2,]   36   81  126
## [3,]   42   96  150