R中的矩阵运算效率

时间:2017-06-23 21:00:49

标签: r matrix

我有3个矩阵X,K和M,如下所示。

x <- matrix(c(1,2,3,1,2,3,1,2,3),ncol=3)
K <- matrix(c(4,5,4,5,4,5),ncol=3) 
M <- matrix(c(0.1,0.2,0.3),ncol=1) 

这是我需要完成的事情。

例如,

Y(1,1)=(1-4)^2*0.1^2+(1-4)^2*0.2^2+(1-4)^2*0.3^2
Y(1,2)=(1-5)^2*0.1^2+(1-5)^2*0.2^2+(1-5)^2*0.3^2
...
Y(3,2)=(3-5)^2*0.1^2+(3-5)^2*0.2^2+(3-5)^2*0.3^2

目前我使用3个for循环来计算R中的最终矩阵。但对于大型矩阵,这需要花费很长的时间来计算。我还需要更改矩阵M中的元素,以找到产生最小平方误差的最佳值。是否有更好的编码方式,即欧几里德规范?

for (lin in 1:N) {
  for (col in 1:K) {
    Y[lin,col] <- 0
    for (m in 1:M){
      Y[lin,col] <- Y[lin,col] + (X[lin,m]-K[col,m])^2 * M[m,1]^2
    }
  }
}

编辑:

我最终使用Rcpp在C ++中编写代码并从R调用它。它明显更快!填充2000 * 2000矩阵需要2-3秒。

1 个答案:

答案 0 :(得分:0)

谢谢。我能够弄清楚这一点。这一变化使我的计算速度提前了两倍。对于可能感兴趣的任何人,我用以下内容替换了最后一个for循环for(m in 1:M)

Y[lin,col] <- norm(as.matrix((X[lin,]-K[col,]) * M[1,]),"F")^2

请注意,我将矩阵M转置为3列而不是1列。