Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R函数效率_R - Fatal编程技术网

R函数效率

R函数效率,r,R,有没有更有效地实现以下功能的想法 prod_A_B <- function(A, B, i = NULL, j = NULL) { if (is.null(i) & is.null(j)) { A * B } else if (!is.null(i) & is.null(j)) { A[i, ] * B[i, ] } else if (!is.null(i) & !is.null(j)) { A[i, j] * B[i, j]

有没有更有效地实现以下功能的想法

prod_A_B <- function(A, B, i = NULL, j = NULL) {

  if (is.null(i) & is.null(j)) {
    A * B
  } else if (!is.null(i) & is.null(j)) {
    A[i, ] * B[i, ]
  } else if (!is.null(i) & !is.null(j)) {
    A[i, j] * B[i, j]
  }

}

prod_A_B您可以通过简化逻辑谓词并取消多个函数调用来节省一些时间,如下所示:

prod2_A_B <- function(A, B, i = NULL, j = NULL) {

  ni <- is.null(i)
  nj <- is.null(j)

  if (ni & nj) {
    A * B
  } else if (nj) { # must be !ni
    A[i, ] * B[i, ]
  } else {         # must be !ni & !nj
    A[i, j] * B[i, j]
  }

}


n <- 1e5
d <- 200
pr1 <- pr2 <- pr <- matrix(0, nrow=n, ncol =d)
A <- matrix(rnorm(n*d), nrow = n, ncol = d)
B <- matrix(rnorm(n*d), nrow = n, ncol = d)
library(microbenchmark)
tm <- microbenchmark(
  {for(i in 1:n) pr1[i,] <- prod_A_B(A, B, i)},
  {for(i in 1:n) pr2[i,] <- prod2_A_B(A, B, i)},
  {for(i in 1:n) pr[i,] <- A[i,] * B[i,]}, 
  times=100L)

print(tm)

Unit: milliseconds
                                           expr      min       lq     mean   median       uq      max neval cld
  {for (i in 1:n) pr1[i, ] <- prod_A_B(A, B, i)}  937.9470 944.6690 969.7894 952.2308 964.4701 1390.467   100   c
  {for (i in 1:n) pr2[i, ] <- prod2_A_B(A, B, i)} 898.6802 908.3323 929.7343 914.6826 929.4356 1211.623   100  b 
  {for (i in 1:n) pr[i, ] <- A[i, ] * B[i, ]}     661.2350 666.7071 688.8127 672.6218 679.9028 1005.342   100 a  

prod2\u A\u B我建议在这里发布:对于代码回顾,您可以
dput
A
B
?@SpaceCowboy好的,我也会在那里发布,谢谢@Sandipan Dey,很抱歉基准代码块不完整,现在已编辑。
prod2_A_B <- function(A, B, i = NULL, j = NULL) {

  ni <- is.null(i)
  nj <- is.null(j)

  if (ni & nj) {
    A * B
  } else if (nj) { # must be !ni
    A[i, ] * B[i, ]
  } else {         # must be !ni & !nj
    A[i, j] * B[i, j]
  }

}


n <- 1e5
d <- 200
pr1 <- pr2 <- pr <- matrix(0, nrow=n, ncol =d)
A <- matrix(rnorm(n*d), nrow = n, ncol = d)
B <- matrix(rnorm(n*d), nrow = n, ncol = d)
library(microbenchmark)
tm <- microbenchmark(
  {for(i in 1:n) pr1[i,] <- prod_A_B(A, B, i)},
  {for(i in 1:n) pr2[i,] <- prod2_A_B(A, B, i)},
  {for(i in 1:n) pr[i,] <- A[i,] * B[i,]}, 
  times=100L)

print(tm)

Unit: milliseconds
                                           expr      min       lq     mean   median       uq      max neval cld
  {for (i in 1:n) pr1[i, ] <- prod_A_B(A, B, i)}  937.9470 944.6690 969.7894 952.2308 964.4701 1390.467   100   c
  {for (i in 1:n) pr2[i, ] <- prod2_A_B(A, B, i)} 898.6802 908.3323 929.7343 914.6826 929.4356 1211.623   100  b 
  {for (i in 1:n) pr[i, ] <- A[i, ] * B[i, ]}     661.2350 666.7071 688.8127 672.6218 679.9028 1005.342   100 a