在 R 中查找数组中最接近元素的最快方法

2023-12-03

我想找到 R 中最快的方法来识别 Ytimes 数组中最接近给定 Xtimes 值的元素索引。

到目前为止,我一直在使用一个简单的 for 循环,但必须有更好的方法来做到这一点:

Xtimes <- c(1,5,8,10,15,19,23,34,45,51,55,57,78,120)
Ytimes <- seq(0,120,length.out = 1000)

YmatchIndex = array(0,length(Xtimes))
for (i in 1:length(Xtimes)) {
  YmatchIndex[i] = which.min(abs(Ytimes - Xtimes[i]))
}

print(Ytimes[YmatchIndex])

强制性 Rcpp 解决方案。利用矢量已排序并且不包含重复项的事实来将O(n^2)进入一个O(n)。对于您的应用来说可能实用,也可能不实用;)

C++:

#include <Rcpp.h>
#include <cmath>
using namespace Rcpp;

// [[Rcpp::export]]
IntegerVector closest_pts(NumericVector Xtimes, NumericVector Ytimes) {
  int xsize = Xtimes.size();
  int ysize = Ytimes.size();
  int y_ind = 0;
  double minval = R_PosInf;
  IntegerVector output(xsize);
  for(int x_ind = 0; x_ind < xsize; x_ind++) {
    while(std::abs(Ytimes[y_ind] - Xtimes[x_ind]) < minval) {
      minval = std::abs(Ytimes[y_ind] - Xtimes[x_ind]);
      y_ind++;
    }
    output[x_ind] = y_ind;
    minval = R_PosInf;
  }
  return output;
}

R:

microbenchmark::microbenchmark(
  for_loop = {
    for (i in 1:length(Xtimes)) {
      which.min(abs(Ytimes - Xtimes[i]))
    }
  },
  apply    = sapply(Xtimes, function(x){which.min(abs(Ytimes - x))}),
  fndIntvl = {
    Y2 <- c(-Inf, Ytimes + c(diff(Ytimes)/2, Inf))
    Ytimes[ findInterval(Xtimes, Y2) ]
  },
  rcpp = closest_pts(Xtimes, Ytimes),
  times = 100
)

Unit: microseconds
     expr      min      lq     mean   median       uq      max neval cld
 for_loop 3321.840 3422.51 3584.452 3492.308 3624.748 10458.52   100   b
    apply   68.365   73.04  106.909   84.406   93.097  2345.26   100  a 
 fndIntvl   31.623   37.09   50.168   42.019   64.595   105.14   100  a 
     rcpp    2.431    3.37    5.647    4.301    8.259    10.76   100  a 

identical(closest_pts(Xtimes, Ytimes), findInterval(Xtimes, Y2))
# TRUE
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 R 中查找数组中最接近元素的最快方法 的相关文章

  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 如何在 Shiny 中提取动态生成的输入值?

    我正在创建一个闪亮的应用程序 它将根据客户的不同功能为客户生成分数 在我闪亮的应用程序中 我提供了 checkboxGroupInput 来选择所需的功能 根据所选功能 应用程序将动态地将 numericInput 添加到 Web ui 以
  • picker输入字体或背景颜色

    我在闪亮的仪表板中使用 pickerInput 这很好 除了一个问题 背景颜色和字体颜色太相似 使得过滤器选择难以阅读 有什么办法可以改变背景或字体颜色吗 如果可能的话 我想继续使用 pickerInput 但如果有一个带有 selectI
  • 如何按用户定义(例如非字母顺序)对数据框进行排序[重复]

    这个问题在这里已经有答案了 给定一个数据框dna gt dna chrom start chr2 39482 chr1 203918 chr1 198282 chrX 7839028 chr17 3874 以下代码重新排序dna by ch
  • 如何纠正 data.frame 上的字符编码

    我有一个像这样的数据框 data names lt data frame DATA c 1 5 rownames data names lt c IV xc1N JOS xc9 LUC xcdA RAM xd3N TO xd1O data
  • C++从文件中读取整数并保存到数组中

    我正在制作一个仅从文本文件读取整数的程序 我想创建一个读取整数并将它们存储在数组中的函数 以便稍后可以使用该数组通过冒泡排序对它们进行排序 这是我到目前为止所得到的 但我得到的输出是一些随机的 803234 数字 void read int
  • 为什么 sapply 的缩放速度比样本大小的 for 循环慢?

    假设我想采用向量 X 2 1 N 并将 e 计算为每个元 素的指数 是的 我认识到最好的方法就是通过向量化 exp X 但这样做的目的是将 for 循环与 sapply 进行比较 我通过逐步尝试三种方法 一种使用 for 循环 两种以不同方
  • 格式化多维数组 Python

    如何编写代码来更改多维数组中每个单独数组的值a出现负值后立即归零 所以里面的第二个数组a有负值 12 34 5 6 88 10 30 75 10 会将其所有值及其后的值转为零 将数组变成 12 34 5 6 88 0 0 0 我怎样才能获得
  • 读取文本文件并将列存储在数组中

    我的文件看起来像这样 01 01 5 00 1 50 7 50 02 01 4 00 3 00 12 00 02 02 3 00 4 00 12 00 03 01 4 50 3 00 13 50 03 01 7 50 2 50 18 75
  • 更新 R6 对象实例中的方法定义

    如何更新 R6 类实例的方法定义 正如我所期望的 S3 使用当前的方法定义 对于 R5 参考类 我可以使用 myInstance myInstance copy 在 R6 中 我尝试了 myInstance myInstance clone
  • 需要从数组中删除字符串[重复]

    这个问题在这里已经有答案了 我在 for 循环中有一个数组 如下所示 var arr abc 5 city 2 area 2 max choice 我只需要这样的数字 var arr 5 2 2 有人可以在这里帮忙吗 另一种方法是使用转换后
  • 如何创建没有循环关系的树形表?

    CREATE TABLE TREE node1 id UUID REFERENCES nodes object id NOT NULL node2 id UUID REFERENCES nodes object id NOT NULL CO
  • 在 Shiny 中显示反应式 htmlTable 表格

    我正在制作我的第一个 Shiny 应用程序 但找不到任何有关如何显示使用 htmlTable 包创建的表格的示例 我基本上想在按下按钮时创建一个表格并显示它 Shiny 显示 html 代码而不是表格 我不知道用什么替换服务器部分中的 re
  • R,使用具有两种以上可能性的二项式分布

    我知道这可能是基本的 但我似乎有一个心理障碍 假设您想要计算在一个骰子上掷出 4 5 或 6 的概率 在 R 中 这很简单 sum 1 6 1 6 1 6 这给出了 1 2 这是正确答案 然而 我内心深处 可能应该保留的地方 认为我应该能够
  • 如何按定义的顺序将图像合并到一个文件中

    我有大约 100 张图像 png 我不想手动执行此操作 而是希望将它们按照定义的顺序 基于文件名 并排放置在一个 pdf 中 每行 12 个图像 有人有什么建议吗 我按照下面托马斯告诉我的方法尝试了 它把它们贴在旁边有一个黑边 我怎样才能去
  • data.table 抛出“找不到对象”错误[重复]

    这个问题在这里已经有答案了 我有一个数据表 library data table mydt lt data table index 1 10 当我在全局环境中尝试它时 我可以让它工作 但当我在调试器中或在包测试中使用它时却无法工作 问题是我
  • 如何循环遍历对象数组并生成键值对?

    我有一个像这样的对象数组 let someObj items id 12 value true id 34 value true id 56 value false 我想将其添加到现有对象中 其中 id 是该对象的键 如下所示 let ob
  • Redim Preserve 给出“下标超出范围”

    我想要Redim Preserve一个数组我不断收到错误 下标超出范围 我知道只有最后一个维度的大小可以更改 这正是我正在做的事情 这里出了什么问题 数组的类型是Variant BmMatrix Sheets BENCH Range a60
  • 为什么这个 R ggplot2 代码会显示一个空白的显示设备?

    虽然 SO 通常不用于帮助解决错误 但这个显示了特别简单且特别烦人的行为 如果你是一个ggplot2用户 您可以在 10 秒或更短的时间内重现它 正如这个 GitHub 问题 ggplot gtable 创建空白显示 https githu
  • case_when 与部分字符串匹配和 contains()

    我正在使用一个数据集 其中有许多名为 status1 status2 等的列 在这些列中 它表示某人是否豁免 完整 注册等 不幸的是 豁免投入并不一致 这是一个示例 library dplyr problem lt tibble perso

随机推荐

  • Directshow录制/预览问题

    我有一个项目 需要使用 DirectShow 从网络摄像头录制视频 但我需要能够在预览继续运行时停止录制 我正在使用 WPFMediaKit http wpfmediakit codeplex com 问题是 当我录制视频时 暂停功能也会暂
  • EclEmma 代码覆盖率插件和 PowerMockRunner

    我在Eclipse中使用EclEmma插件时遇到了问题 当我使用注释时它不显示代码覆盖率 RunWith通过 PowerMockRunner class 作为一个论点 如果使用 MockitoJUnitRunner class 一切安好 等
  • 如何更改 SwiftUI 中导航栏标题的文本属性?

    最近 我一直在尝试新的 SwiftUI 框架 我确实对该框架的工作原理有基本的了解 但我无法找到更改导航栏标题属性的方法 我使用的是最新的 Xcode 11 beta 5 和相应的 swift swiftUI 版本 我已经尝试过一些事情 我
  • C++\CLI 应用程序加载时崩溃

    我有一个 C 应用程序 它加载大量 C DLL 和一些选定的 C CLI DLL 在其中一台计算机 Windows Server 2003 SP2 上启动时收到错误消息 应用程序无法正确初始化 0xC0000005 单击 确定 终止应用程序
  • 如何在没有秒的情况下格式化 MySQL TIMEDIFF?

    我正在运行这个SELECT陈述 TIMEDIFF NOW posts date modified as time ago 并得到格式的结果02 58 32 最后一组数字 32 是秒数 我怎样才能省略秒 SELECT TIME FORMAT
  • iOS 的 Cordova healthkit 插件函数返回未定义?

    我正在尝试使用科尔多瓦插件健康我正在开发的phonegap应用程序的插件 每当我使用该应用程序时 每个插件都可以工作 但这个插件除外 我正在使用phonegap mac 应用程序在iPhone 6s 上进行测试 我已采取的步骤 安装的插件c
  • 仅在根进程上声明的数组

    特别是在 Fortran 的 MPI 中 仅在根进程上定义数组是否可能并且是一个不错的选择 例如这样的事情 program test implicit none include mpif h all mpi init ierr call m
  • 比较两个字符串并返回差异。 Python 3 [重复]

    这个问题在这里已经有答案了 我的目标是编写一个程序来比较两个字符串并显示前两个不匹配字符之间的差异 例子 str1 dog str2 doc 应该返回 gc 我知道我尝试使用的代码很糟糕 但我希望收到一些提示 这是我解决这个练习的糟糕尝试
  • C#性能分析-如何计算CPU周期?

    这是进行性能分析的有效方法吗 我想要获得纳秒精度并确定类型转换的性能 class PerformanceTest static double last 0 0 static List numericGenericData new List
  • 如何创建 html 输入文本区域,以便可以为某些单词添加下划线或设置其格式?

    我想要一个输入字段 我可以让javascript为输入字段的不同部分设置某些属性 一个简单的例子来演示我想做的事情 假设我想在输入文本区域中的所有咒语单词下划线 因此 当插入新字母时 JavaScript 将检查输入文本区域 并且对于与我的
  • RichtextBox 中的粗体

    我一直在研究我的富文本框 但遇到了一些奇怪的事情 我想将每一行的第一个单词加粗 使用此代码 RichTextBox bold richTextBox1 foreach string line in bold Lines string nam
  • 用于向下钻取图表的自己的后退按钮

    我有一个带有向下钻取数据的饼图 是否可以隐藏默认的后退按钮并从我自己的按钮触发后退功能 是的 这是可能的 只需创建您自己的按钮 然后单击调用chart drillUp 功能 看docs Highcharts v5 和 v6 在 Highch
  • AWS RDS 是否支持 MySQL 作为文档存储

    我能够连接普通的AWS RDS MySQL实例 5 7 16 但是 由于我必须使用 MySQL 作为文档存储 因此我通过安装 mysqlx 插件配置了 MySQL 实例 这是文档存储所需的 此后 我尝试连接同一实例上端口 33060 上的
  • YouTube 嵌入视频开始/停止事件

    我想知道 通过 iframe 嵌入 YouTube 视频是否会暴露某些事件 例如 onStart 或 onStop 您可以在其中指定一些回调 这是处理启动和停止事件的示例 HTML 文件 index html
  • 如何在 Spring Boot 中将 Json 字节数组转换为 AMQP?

    按照此 我有这个代码 Bean open fun messageConverter om ObjectMapper MessageConverter return Jackson2JsonMessageConverter om Bean o
  • 在 PySpark 2.0 中读取序列文件

    我有一个序列文件 其值如下所示 string value json value 我不关心字符串值 在 Scala 中我可以通过以下方式读取文件 val reader sc sequenceFile String String path va
  • 如何使用 PyGame 计时器事件?如何使用计时器向 pygame 屏幕添加时钟?

    我是 python 新手 因此决定尝试制作一个简单的游戏pygame 我想添加一个计时器 时钟来显示 你已经玩了 生存了多长时间 所以基本上创建了一个时钟 然而 我四处搜寻并得到了time sleep 1 它确实可以作为时钟使用 但它会减慢
  • 将多个 Intent 从单个 Activity 发送到另一个 Activity

    我对 android 很陌生 我正在尝试将用户输入的数据 他们的名字 发送到另一个活动 我过去能够使用意图在活动之间发送单行 但我无法弄清楚如何将两个不同的字符串发送到两个不同的 TextView 这是到目前为止我的 MainActivit
  • 使用 jQuery 解析 JSON

    我正在尝试使用 jQuery 解析以下 JSON 并获取每个 id 值 有人可以建议吗 id 1 name Boat id 2 name Cable 到目前为止我有 each test function i item alert item
  • 在 R 中查找数组中最接近元素的最快方法

    我想找到 R 中最快的方法来识别 Ytimes 数组中最接近给定 Xtimes 值的元素索引 到目前为止 我一直在使用一个简单的 for 循环 但必须有更好的方法来做到这一点 Xtimes lt c 1 5 8 10 15 19 23 34