如何让函数执行得更快?

2023-12-02

我有以下功能:https://i.stack.imgur.com/yXA67.png, where mu是矩阵(n_X 行和 n_Y 列)。 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])
          }}}} 
}

例如:

X <- matrix(rep(1,50),nrow = 50)
Y <- matrix(c(1:50),nrow = 50)
d_X <- as.matrix(dist(X, method = "euclidean", diag = T, upper = T))
d_Y <- as.matrix(dist(Y, method = "euclidean", diag = T, upper = T)) 
mu <- matrix(1/50, nrow = nrow(X), ncol = nrow(Y))

H_mu(mu, d_X, d_Y)
[1] 41650

> system.time(H_mu(mu, d_X, d_Y))
   user  system elapsed 
  22.67    0.01   23.06 

仅 50 点计算就需要 23 秒。

如何加速这个功能?


看来@Marat Talipov 的建议是可行的。如果您不熟悉 C++ 编码,可以使用类型函数为简单的 R 函数自动生成 Rcpp 代码。它接受 R 函数及其参数及其类型,假设存在显式return调用,并返回文本代码。

 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)
}

这里我添加了return(value)给你的H_mu功能

text <- typedFunction(H_mu, H_mu='double', value='double',
              mu='NumericVector',
              d_X='NumericVector',
              d_Y='NumericVector',
              i='int',
              ii='int',
              jj='int',
              j='int')
cat(text)

将结果复制粘贴到您的 Rcpp 编辑器中,稍作调整后您就拥有了可执行文件H_mu_typed功能。

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++ 的速度。

H_mu_typed(mu, d_X, d_Y)
[1] 41650

system.time(H_mu_typed(mu, d_X, d_Y))[3]
elapsed 
   0.01 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让函数执行得更快? 的相关文章

随机推荐

  • 将自定义角色分配给 Azure Active Directory 系统托管标识

    为了在 API 之间建立 Azure AD 系统托管标识 我在应用程序清单中为目标 API 定义了一个自定义角色 appRoles allowedMemberTypes Application description Allow the a
  • 在 C# 中测试/注入私有字段的良好做法是什么

    如果这是重复的 我很抱歉 我被赋予了为该方法添加一些覆盖范围的任务 并被告知要模拟私有的List
  • PHP 中的数字格式

    我想将带小数位的数字格式化为不带小数位的格式 例如 146 5 到 146500000 我如何在 PHP 中实现这一点 谢谢 乘以100000 没那么容易
  • 在 Excel 中导入 CSV 美国格式的数字并进行本地化?

    我有一个包含以下值的 csv 文件 1488201602 653 8 304700E 04 3 079498E 03 1488201603 107 8 677357E 04 2 856719E 03 1488201821 012 7 071
  • 另一个线性渐变内的线性渐变

    我正在尝试在另一个线性渐变中创建线性渐变 这可能吗 下面的例子 background linear gradient to right color1 50 color2 0 颜色 1 是 background linear gradient
  • ARM Aarch64 中的 PUSH {lr} 和 POP {lr}

    等效指令是什么PUSH lr and POP lr 在ARM Aarch64指令集中 Is STR X30 SP 8 正确的 您能解释一下维护堆栈对齐的概念吗 我对 ARMv8 比较陌生 所以请原谅 如果您要求 C 编译器从源代码生成汇编语
  • WIX 自定义操作:使用 dllimport

    我有一个 WiX 安装程序和自定义操作项目 我添加了 C 库作为自定义操作项目的参考 此 C dll 使用 DllImport 到一个 C dll 安装时收到错误 无法加载 DLLmycpp dll 未找到指定的模块 我添加了mycpp d
  • 为什么Fortran可以分配这么大的数组?

    我编写了一段科学代码 像往常一样 这归结为计算代数特征值方程中的系数 计算这些系数需要对多维数组进行积分 这会迅速大幅增加内存使用量 一旦计算出矩阵系数 就可以释放原始的预积分多维数组 并由智能求解器接管 因此内存使用不再是大问题 正如您所
  • 指定绘图上多条线的颜色[重复]

    这个问题在这里已经有答案了 Pandas 数据框分组图 我有一个与上述问题类似的数据框 但它有大约 8 个股票代码 我定义了一个名为 颜色 的颜色列表 与股票代码相对应 但是当我这样做时 df groupby ticker adj clos
  • 使用map-reduce构建分布式KD树

    我正在尝试使用map reduce 构建分布式KD 树 分布式KD树的描述可以在这里找到Dkd Tree I have a feature vector of images having dimension 20 I have to bui
  • 如何在powershell中的正则表达式中插入变量

    我试图查看文件中是否存在某些输入的条目 因此我使用正则表达式来查询每一行 cat file where match script fileName 其中 fileName 是其他地方定义的一些输入 如何更改正则表达式以插入变量而不是匹配 f
  • 空手道:[主要] INFO com.intuit.karate - karate.env 系统属性为:null [重复]

    这个问题在这里已经有答案了 在尝试使用生成的令牌执行下一个场景时 在令牌身份验证流程之后出现错误 主要 INFO com intuit karate 空手道系统属性为 null 我使用了以下代码 特征文件 Feature Login Tok
  • Python项目结构和相关导入

    我是Python新手 我在谷歌上搜索了很多 并阅读了一些有关相对导入等的文章 尽管事实上我无法让它工作 请考虑我的以下项目结构 Project docs log prev src a py tests tests1 b py tests2
  • 直接从无头图像字节数组创建缩略图

    我的应用程序一次显示大量图像缩略图 目前 我将所有全尺寸图像保留在内存中 并简单地在 UI 中缩放图像以创建缩略图 但是 我宁愿只在内存中保留小缩略图 并且仅在必要时加载全尺寸图像 我认为这很容易 但与仅在 UI 中缩放全尺寸图像相比 我生
  • 您的凭据不允许访问此资源 Twitter API 错误

    我正在研究 Twitter api 一些 api 得到了响应 但statuses home timeline jsonapi 和其他 api 没有得到响应 出现错误 errors code 220 message Your credenti
  • 从 AEM 下载包后如何在 Eclipse 中使用它

    我从包管理器中从正在运行的 AEM 实例下载了一个 zip http localhost 4502 crx packmgr index jsp 解压缩后的 zip 文件包含 jcr root and META INF 我想在此 zip 文件
  • 如何自动允许 IE 中阻止的内容?

    我使用下面的代码作为示例菜单
  • 水平和垂直滑动的动态视图

    请检查上面的视图 我必须相应地创建一个视图 当我们从左向右滑动时 图像将与从右向左滑动相同 当我从上到下滑动时 将会出现网络视图 并且从下到上滑动图像将会出现 所有数据 例如图像和网址 都是动态的 并且数据将来自服务器 我还必须在其中应用拉
  • JAXB 将循环引用映射到 XML

    我有一个包含循环的对象图 我如何让 JAXB 处理这个问题 我尝试使用 XmlTransient子类中的注释 但 JAXB 编组器仍然检测到循环 Entity XmlRootElement public class Contact Id p
  • 如何让函数执行得更快?

    我有以下功能 https i stack imgur com yXA67 png where mu是矩阵 n X 行和 n Y 列 d X 和 d Y 是距离矩阵 在 R 中实现此函数的一种方法是 H mu lt function mu d