R 如何使函数执行得更快?

R 如何使函数执行得更快?,r,performance,loops,R,Performance,Loops,我有以下函数:,其中mu是矩阵(nux行和nuy列)。d_X和d_Y是距离矩阵 在R中实现此功能的一种方法是: H_mu <- function(mu, d_X, d_Y){ value <- 0 for(i in 1:nrow(d_X)){ for(ii in 1:nrow(d_X)){ for(j in 1:nrow(d_Y)){ for(jj in 1:nrow(d_Y)){

我有以下函数:,其中mu是矩阵(nux行和nuy列)。d_X和d_Y是距离矩阵

在R中实现此功能的一种方法是:

H_mu <- function(mu, d_X, d_Y){

    value <- 0
    for(i in 1:nrow(d_X)){
       for(ii in 1:nrow(d_X)){
          for(j in 1:nrow(d_Y)){
             for(jj in 1:nrow(d_Y)){
                value <- value + mu[i,j]*mu[ii,jj]*abs(d_X[i,ii]-d_Y[j,jj])
          }}}} 
}

H_mu这将为每个循环节省2次名称查找和一次函数调用(即
[
),速度快了8%(因此@Marat Talipov的建议是可行的):


H_mu_2这将为每个循环节省2个名称查找和一个函数调用(即
[
),速度快了8%(因此@Marat Talipov的建议是可行的):


<代码> HMUY2看起来像是MalAT TaliPoV的建议,如果你不喜欢C++中的编码,你可以使用自动生成RPR代码来简单的R函数。它需要R函数及其参数以及它们的类型,假设有明确的代码>返回< /Cord>调用,并返回文本代码。
 H_mu <- function(mu, d_X, d_Y){      
  value <- 0
  for(i in 1:nrow(d_X)){
    for(ii in 1:nrow(d_X)){
      for(j in 1:nrow(d_Y)){
        for(jj in 1:nrow(d_Y)){
          value <- value + mu[i,j]*mu[ii,jj]*abs(d_X[i,ii]-d_Y[j,jj])
        }}}} 
  return (value)
}
将结果复制粘贴到您的Rcpp编辑器中,稍作调整后,您就有了可执行的
H\u mu\u type
函数

Rcpp::cppFunction('double H_mu_typed(NumericMatrix mu, NumericMatrix d_X, NumericMatrix d_Y) {
  double value=0;
                  value = 0;
                  for (int i = 0; i <d_X.nrow(); i++) {
                  for (int ii = 0; ii < d_X.nrow(); ii++) {
                  for (int j = 0; j < d_Y.nrow(); j++) {
                  for (int jj = 0; jj < d_Y.nrow(); jj++) {
                  value = value + mu(i, j) * mu(ii, jj) * abs(d_X(i, ii) - d_Y(j, jj));
                  };
                  };
                  };
                  };
                  return(value);
                  }
                  ')

似乎是@马拉特-塔利波夫的建议,如果你不喜欢C++中的编码,你可以用它来自动生成简单的R函数的RCPP代码。它需要R函数及其参数以及它们的类型,假设有明确的代码>返回< /代码>调用,并返回文本代码。

 H_mu <- function(mu, d_X, d_Y){      
  value <- 0
  for(i in 1:nrow(d_X)){
    for(ii in 1:nrow(d_X)){
      for(j in 1:nrow(d_Y)){
        for(jj in 1:nrow(d_Y)){
          value <- value + mu[i,j]*mu[ii,jj]*abs(d_X[i,ii]-d_Y[j,jj])
        }}}} 
  return (value)
}
将结果复制粘贴到您的Rcpp编辑器中,稍作调整后,您就有了可执行的
H\u mu\u type
函数

Rcpp::cppFunction('double H_mu_typed(NumericMatrix mu, NumericMatrix d_X, NumericMatrix d_Y) {
  double value=0;
                  value = 0;
                  for (int i = 0; i <d_X.nrow(); i++) {
                  for (int ii = 0; ii < d_X.nrow(); ii++) {
                  for (int j = 0; j < d_Y.nrow(); j++) {
                  for (int jj = 0; jj < d_Y.nrow(); jj++) {
                  value = value + mu(i, j) * mu(ii, jj) * abs(d_X(i, ii) - d_Y(j, jj));
                  };
                  };
                  };
                  };
                  return(value);
                  }
                  ')

Rcpp
可能是最简单的方法。
Rcpp
可能是最简单的方法。
Rcpp::cppFunction('double H_mu_typed(NumericMatrix mu, NumericMatrix d_X, NumericMatrix d_Y) {
  double value=0;
                  value = 0;
                  for (int i = 0; i <d_X.nrow(); i++) {
                  for (int ii = 0; ii < d_X.nrow(); ii++) {
                  for (int j = 0; j < d_Y.nrow(); j++) {
                  for (int jj = 0; jj < d_Y.nrow(); jj++) {
                  value = value + mu(i, j) * mu(ii, jj) * abs(d_X(i, ii) - d_Y(j, jj));
                  };
                  };
                  };
                  };
                  return(value);
                  }
                  ')
H_mu_typed(mu, d_X, d_Y)
[1] 41650

system.time(H_mu_typed(mu, d_X, d_Y))[3]
elapsed 
   0.01