在 R 中高效复制矩阵

2024-01-28

我有一个矩阵,并寻找一种有效的方法来将其复制 n 次(其中 n 是数据集中的观测值数量)。例如,如果我有一个矩阵 A

A <- matrix(1:15, nrow=3)

然后我想要一个表单的输出

rbind(A, A, A, ...) #n times.

显然,有很多方法可以构造如此大的矩阵,例如使用for循环或apply或类似的功能。然而,对“矩阵复制函数”的调用发生在我的优化算法的核心中,在程序的一次运行期间它被调用了数万次。因此,循环、应用类型的函数以及类似的东西都不够高效。 (这样的解决方案基本上意味着 n 上的循环执行了数万次,这显然效率低下。)我已经尝试过使用普通的rep函数,但还没有找到一种方法来安排输出rep以所需格式的矩阵。

解决方案do.call("rbind", replicate(n, A, simplify=F))也太低效了,因为rbind在这种情况下使用得太频繁了。 (然后,我的程序总运行时间的大约 30% 花费在执行 rbinds 上。)

有谁知道更好的解决方案?


另外两个解决方案:

第一个是问题中示例的修改

do.call("rbind", rep(list(A), n))

第二个涉及展开矩阵、复制它并重新组装它。

matrix(rep(t(A),n), ncol=ncol(A), byrow=TRUE)

既然要求的是效率,那么就需要对标

library("rbenchmark")
A <- matrix(1:15, nrow=3)
n <- 10

benchmark(rbind(A, A, A, A, A, A, A, A, A, A),
          do.call("rbind", replicate(n, A, simplify=FALSE)),
          do.call("rbind", rep(list(A), n)),
          apply(A, 2, rep, n),
          matrix(rep(t(A),n), ncol=ncol(A), byrow=TRUE),
          order="relative", replications=100000)

这使:

                                                 test replications elapsed
1                 rbind(A, A, A, A, A, A, A, A, A, A)       100000    0.91
3                   do.call("rbind", rep(list(A), n))       100000    1.42
5  matrix(rep(t(A), n), ncol = ncol(A), byrow = TRUE)       100000    2.20
2 do.call("rbind", replicate(n, A, simplify = FALSE))       100000    3.03
4                                 apply(A, 2, rep, n)       100000    7.75
  relative user.self sys.self user.child sys.child
1    1.000      0.91        0         NA        NA
3    1.560      1.42        0         NA        NA
5    2.418      2.19        0         NA        NA
2    3.330      3.03        0         NA        NA
4    8.516      7.73        0         NA        NA

所以最快的是原始的rbind调用,但这假设n是固定的并且是提前知道的。如果n不固定,那么最快的是do.call("rbind", rep(list(A), n)。这些用于 3x5 矩阵和 10 次复制。不同大小的矩阵可能会给出不同的排序。

EDIT:

对于 n=600,结果的顺序不同(省略了显式的rbind版本):

A <- matrix(1:15, nrow=3)
n <- 600

benchmark(do.call("rbind", replicate(n, A, simplify=FALSE)),
          do.call("rbind", rep(list(A), n)),
          apply(A, 2, rep, n),
          matrix(rep(t(A),n), ncol=ncol(A), byrow=TRUE),
          order="relative", replications=10000)

giving

                                                 test replications elapsed
4  matrix(rep(t(A), n), ncol = ncol(A), byrow = TRUE)        10000    1.74
3                                 apply(A, 2, rep, n)        10000    2.57
2                   do.call("rbind", rep(list(A), n))        10000    2.79
1 do.call("rbind", replicate(n, A, simplify = FALSE))        10000    6.68
  relative user.self sys.self user.child sys.child
4    1.000      1.75        0         NA        NA
3    1.477      2.54        0         NA        NA
2    1.603      2.79        0         NA        NA
1    3.839      6.65        0         NA        NA

如果您包括明确的rbind版本,它比do.call("rbind", rep(list(A), n))版本,但不是很多,而且比这两个版本都慢apply or matrix版本。所以泛化到任意n在这种情况下不需要损失速度。

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

在 R 中高效复制矩阵 的相关文章

  • fread 的填充选项

    假设我有这个 txt 文件 AA 3 3 3 3 CC ad 2 2 2 2 2 ZZ 2 AA 3 3 3 3 CC ad 2 2 2 2 2 With read csv I can gt read csv linktofile txt
  • 如果为 null 则替换为 0,否则在同一列中使用默认值

    在SparkR shell 1 5 0中 创建了一个示例数据集 df test lt createDataFrame sqlContext data frame mon c 1 2 3 4 5 year c 2011 2012 2013 2
  • R/ggplot2:在执行 ylim 上限的同时平滑整个数据集

    更新 我找到了答案 包含在下面 我有一个包含以下变量和类似值的数据集 COBSDATE CITY RESPONSE TIME 2011 11 23 A 1 1 2011 11 23 A 1 5 2011 11 23 A 1 2 2011 1
  • 将复数名词转换为单数名词

    如何使用 R 将复数名词转换为单数名词 我使用 tagPOS 函数来标记每个文本 然后提取所有标记为 NNS 的复数名词 但是如果我想将这些复数名词转换为单数该怎么办 library openNLP library tm acq o lt
  • 如何在R中使用twoord.plot()绘制多个图(分面)?

    我的数据看起来像这样 height lt c 1 2 3 4 2 4 6 8 weight lt c 12 13 14 15 22 23 24 25 person lt c Jack Jim Jill Tess Jack Jim Jill
  • Shiny + downloadHandler + Openxlsx 不生成xlsx文件

    我试图通过 Openxlsx 包生成一个 xlsx 文件 其中包含文件内的反应名称和标头 输入变量为 ASL 1 和 Year 1 要保存在文件中的对象是反应表 tab 1 它是由应用程序生成的 没有任何问题 但是当我尝试下载它时 浏览器
  • 在 R 中使用 NA 计算栅格数据的变异函数

    Summary 我有一个包含 NA 值的栅格数据集 并且想要计算它的变异函数 忽略 NA 我怎样才能做到这一点 我有一个图像 已使用以下命令加载到 R 中readGDAL函数 存储为im 为了使其可重复 结果dput图像上可在https g
  • 在 R 中连接/匹配数据帧

    我有两个数据框 第一列有两列 x是水深 y是每个深度的温度 第二个也有两列 x也是水深 但与第一个表中的深度不同 第二栏z是盐度 我想通过以下方式连接两个表x 通过增加z到第一张桌子 我已经学会了如何使用 key 来连接表tidyr 但只有
  • 在具有德语区域设置的 Windows 上将 ISO 8601 一年中的周数字与一年中的月份数字相匹配

    这与我的问题直接相关来自每周时间格式的日期的 POSIX 日期 https stackoverflow com questions 41597604 posix date from dates in weekly time format 但
  • 无法使用 Shinyjs() 禁用闪亮的应用程序单选按钮

    我正在尝试禁用闪亮的应用程序单选按钮 趋势 input Product A input month All 使用Shinyjs包 但没有成功 我的 ui 页面定义为 ui lt fluidPage shinyjs useShinyjs pa
  • 如何创建热图来说明控制发散调色板中心颜色位置的网格差异?

    我有两个人脸 3D 网格 我希望使用热图来说明差异 我想使用红蓝发散色阶 我的数据可以查到here https github com Patricklv How to create heatmap illustraing 3D mesh d
  • 在 R 中每小时获取在线数据

    我想获取天文台每小时更新预报的数据 我的一次性数据提取代码如下 library RCurl web lt getURL http www hko gov hk contente htm web lt unlist strsplit web
  • 在 grid.text 中使用 pch 字符

    我使用 ggplot2 创建了一个图表 现在我想让图例不在图表上 而是在图表外的网格中 我现在的问题是 是否有人知道是否有可能在 grid text 中使用 pch 符号 Here is an image to show what I wa
  • R data.table 计算行数,直到达到值

    我想在 data table 中返回一个新列 该列显示在达到低于当前值 Temp 的值之前有多少行 library data table set seed 123 DT lt data table Temp runif 10 0 20 这就
  • 在单个图中获取 geom_hex 中的观测值 (Shiny)

    我正在尝试创建一个十六进制的交互式图 用户可以单击给定的十六进制 并接收分组在该单击的十六进制中的原始数据帧的所有观察结果的列表 下面是一个 MWE 看起来非常接近我的目标 我正在使用 Shiny hexbin 和 ggplotly app
  • 如何格式化DT背景*每行*?

    我想用DTformatStyle 给出颜色渐变per row 鉴于此示例数据 library DT data lt round data frame x runif 5 0 5 y runif 5 0 10 z runif 5 0 20 3
  • 用任意数量的空格分割字符串

    我有以下字符串 1 10012 CAB UNCH CAB 我想按间隙分割该字符串 但间隙的空格数量是可变的 有没有办法使用strsplit 函数来分割这个字符串并返回一个包含 8 个元素的向量 该向量已删除所有间隙 一行代码是首选 只需使用
  • 匹配较大向量中的序列

    我想要一个函数 它返回向量的匹配子序列的初始索引 例如 y lt c a a a b c multi match c a a y 1 1 2 multi match c a b y 1 3 我有一个粗略的实现 但我觉得我必须重新发明轮子 而
  • 将箱线图与 Wilcoxon 检验进行比较

    我正在使用 R 中的 ggplot2 包比较两组长度 不同的个体 和箱线图 我想比较这两个分布 但到目前为止我发现使用 wilcoxon 测试的唯一方法是 ggpubr 包中的 stat compare means 这是比较分布的正确方法吗
  • Rvest 从 select 中提取选项值和文本

    Rvest 选择选项 我认为用可重现的示例来解释是最简单的 网站 http www verema com vinos portada http www verema com vinos portada我想获取葡萄酒的类型 Tipos de

随机推荐