将函数应用于多维数组:R 与 MATLAB

2023-11-26

这个问题可以被认为与this one,这帮助我提高了 R 在计算大数组平均值时的性能。不幸的是,在这种情况下,我尝试应用更复杂的东西(例如分位数计算)。

我有一个包含超过 4000 万个元素的 4 维数组,我想计算特定维度上的第 66 个百分位数。这是 MATLAB 代码:

> n = randn(100, 50, 100, 20);
> tic; q = quantile(n, 0.66, 4); toc
Elapsed time is 0.440824 seconds.

让我们在 R 中做类似的事情。

> n = array(rnorm(100*50*100*20), dim = c(100,50,100,20))
> start = Sys.time(); q = apply(n, 1:3, quantile, .66); print(Sys.time() - start)
Time difference of 1.600693 mins

我知道 MATLAB wrt R 具有更好的性能,但在这种情况下我不知道该怎么办。也许我只需要等待 2 分钟而不是一秒钟...... 我希望有人能建议我任何提高跑步时间的方法, 不管怎样,先谢谢你了……

UPDATE我已将一些建议应用到评论中,并减少了运行时间:

> start = Sys.time(); q = apply(n, 1:3, quantile, .66, names = FALSE); print(Sys.time() - start)
Time difference of 33.42773 secs

我们距离 MATLAB 的表现还很远,但至少我学到了一些东西。

UPDATE我在这里提出了与讨论的“分位数”函数相关的一些进展here。我上面显示的相同代码的运行时间已从 33 秒缩短到 5 秒......


The 八度音程包调用GNU 倍频程API函数; 如果你还不知道GNU 倍频程, it is very如同Matlab并致力于完全兼容。

这几乎和直接 Matlab 一样快......

library(RcppOctave)

set.seed(1)
n = array(rnorm(100*50*100*20), dim = c(100,50,100,20))

system.time( s <- octave_style_quantile(n, .66, 4) )
##    user  system elapsed 
##   0.526   0.048   0.574

# *R* `quantile` argument `type=5` is the method that matches matlab.
system.time( r <- apply(n, 1:3, quantile, .66, names = FALSE, type=5) )
##    user  system elapsed 
##  23.308   0.029  23.327

dim(r)
## [1] 100  50 100

identical(r,s)
## [1] TRUE

Octave 的相当直接的翻译分位数.m to R.

octave_style_quantile <- function (x, p=NULL, dim=NULL) {
  if ( is.null(p) ) p <- c(0.00, 0.25, 0.50, 0.75, 1.00)

  if ( is.null(dim) ) {
    ## Find the first non-singleton dimension.
    dim <- which(dim(x) > 1)[1];
  }

  stopifnot( is.numeric(x)||is.logical(x),
             is.numeric(p),
             dim <= length(dim(x)) )

  ## Set the permutation vector.
  perm <- seq_along(dim(x))
  perm[1] <- dim
  perm[dim] <- 1

  ## Permute dim to the 1st index.
  x <- aperm(x, perm);

  ## Save the size of the permuted x N-d array.
  sx = dim(x);

  ## Reshape to a 2-d array.
  dim(x) <- c( sx[1], prod(sx[-1]) );

  ## Calculate the quantiles.
  q = .CallOctave("quantile",x,p)

  ## Return the shape to the original N-d array.
  dim(q) <- c( length(p), sx[-1] )

  ## Permute the 1st index back to dim.
  q = aperm(q, perm);
  if( any(dim(q)==1) ) dim(q) <- dim(q)[-which(dim(q)==1)]
  q
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将函数应用于多维数组:R 与 MATLAB 的相关文章

  • R 中的发散积分可在 Wolfram 中求解

    我知道我以前问过同样的问题 但由于我是新来的 这个问题问得不好而且不可重现 因此我在这里尝试做得更好 如果我只编辑旧的 可能没有人会读它 我有一个想要积分的二重积分 ff lt function g t exp 16 g exp 8 t t
  • 如何在 MATLAB 中绘制纹理映射三角形?

    我有一个三角形 u v 图像中的坐标 我想在 3D 坐标处绘制这个三角形 X Y Z 与图像中的三角形进行纹理映射 Here u v X Y Z都是具有三个元素的向量 代表三角形的三个角 我有一个非常丑陋 缓慢且令人不满意的解决方案 其中我
  • JDBC插入实数数组

    我试图将一个真实的数组插入到 postgresql 数组中 该表的定义是 String sqlTable CREATE TABLE IF NOT EXISTS ccmBlock sampleId INTEGER block REAL 插入内
  • 如何从数组中提取特定元素?

    如果我有一个数组a 1 2 3 4 5 6 7 8 9 10 我想要这个数组的一个子集 第 1 个 第 5 个和第 7 个元素 是否可以通过简单的方式从该数组中提取这些内容 我在想这样的事情 a 0 4 6 1 5 7 但这行不通 还有一种
  • 检测分段常数信号中的阶跃

    我有一个分段恒定信号 如下所示 我想检测步骤转换的位置 标记为红色 我目前的做法 使用移动平均滤波器平滑信号 http www mathworks com help signal examples signal smoothing html
  • MATLAB 列含义的内存分析

    我正在使用 MATLAB 配置文件来使用命令观察内存 profile memory on profile clear my code profile report and i got this table 1 我想问一下什么意思 已分配内存
  • 为绘图制作 2D 图例 - 双变量分区统计图

    我一直在玩双变量 choropleth 地图 并且一直在如何创建类似于 2d 图例的问题上陷入困境约书亚 史蒂文斯 http www joshuastevens net cartography make a bivariate chorop
  • 从 numpy 数组中删除连续的 RGB 值

    我最初根据灰度图像的初始数组创建了一个子数组 从 numpy 数组中删除连续数字 https stackoverflow com questions 50743769 deleting consecutive numbers from a
  • 使用 R 进行项目组织 [重复]

    这个问题在这里已经有答案了 可能的重复 统计分析和报告撰写的工作流程 https stackoverflow com questions 1429907 workflow for statistical analysis and repor
  • R:表格格式

    我有一个包含以下列的 Excel 文件 Column1 Column2 Column3 ab bb 0 5 ab bc 0 1 ab cd 0 7 ab dd 0 8 ac bb 0 2 ac bg 0 8 ac ee 0 8 ac dd
  • 为什么这些数字不相等?

    下面的代码显然是错误的 有什么问题 i lt 0 1 i lt i 0 05 i 1 0 15 if i 0 15 cat i equals 0 15 else cat i does not equal 0 15 i does not eq
  • 在 VB.Net 中将字节数组转换为整数

    我想知道在 vb net 中将字节数组 长度 4 转换为整数的最佳方法是什么 我知道 BitConverter 但执行函数调用来执行应该可以通过复制 4 字节内存来完成的操作似乎相当浪费 同样 将单 双精度数从二进制表示形式转换为单 双精度
  • R - 通过覆盖和递归合并列表

    假设我有两个带有名字的列表 a list a 1 b 2 c list d 1 e 2 d list a 1 b 2 b list a 2 c list e 1 f 2 d 3 e 2 我想递归地合并这些列表 如果第二个参数包含冲突的值 则
  • 最小化代表性整数的误差之和

    Given n integers between 0 10000 as D1 D2 Dn where there may be duplicates and n can be huge I want to find k distinct r
  • 如何在R中同时对三个字段进行网络分析

    如何在 R 中同时对三个字段进行网络分析 下面是示例数据以及desired output在最后一栏中 df lt data frame stringsAsFactors FALSE id 1 c ABC ABC BCD CDE DEF EF
  • 16 位以上整数的计算

    我有两个大整数 两者都超过 16 位 确切地说是 20 位 而且我知道由于双精度浮点运算 我在使用这些数字进行计算甚至将它们存储在变量中 独立于编程语言 时受到限制 不过 我想也许gmp图书馆应该处理它们 但不幸的是它没有 可以计算更大的整
  • 将 Matlab 的 datenum 格式转换为 Python

    我刚刚开始从 Matlab 迁移到 Python 2 7 在读取 mat 文件时遇到一些问题 时间信息以 Matlab 的日期数字格式存储 对于那些不熟悉它的人 日期序列号将日历日期表示为自固定基准日期以来已经过去的天数 在 MATLAB
  • ggplot2、R 中的单条形条形图

    我有以下数据和代码 gt ddf var1 var2 1 aa 73 2 bb 18 3 cc 9 gt gt dput ddf structure list var1 c aa bb cc var2 c 73L 18L 9L Names
  • 具有 dplyr、tidyverse 和 broom 的相关矩阵 - P 值矩阵

    全部 我想使用以下方法从相关矩阵中获取 p 值dplyr 和 或扫帚包 并同时测试多个变量 我知道其他方法 但 dplyr 对我来说似乎更简单 更直观 此外 dplyr 需要关联每个变量以获得特定的 p 值 这使得该过程更容易 更快 我检查
  • 单击 R 中的 Sankey Chart 线时添加额外的标签值

    以下 R 闪亮脚本创建一个桑基图 如下面的快照所示 我的要求是 当我单击左右节点之间的任何链接 即 a1 和 a2 时 我希望相应的 a3 的总和出现在标签中 例如 a1 中的 A 和 a2 中的 E 总共具有值 50 和 32 因此 我想

随机推荐

  • 无法在 nginx-ingress 上添加具有同一主机的多个 Ingress

    我正在尝试添加多个应共享同一主机的入口 一个 Ingress 应该处理对 www example de some 的请求 另一个 Ingress 应该处理所有其他请求 这是 Ingress 配置的片段 apiVersion extensio
  • Laravel - artisan down /维护模式除了自己的IP

    目前我正在使用 Laravel5 我的问题是如果我使用维护模式 php artisan down 怎么能说 除了我自己的 IP 之外 每个人的应用程序都已关闭 所以每个人都看到维护模式 但我仍然可以访问该网站 现在你可以使用php arti
  • 在文本区域内显示div

    我希望在文本区域中显示 html 是否可以显示一个 div a 内包含表单元素 div
  • 具有链式方法的 Java 方法调用顺序

    给出的是以下 Java 代码示例 builder something somethingElse somethingMore builder getSomething Java 语言规范是否保证getSomething 被调用after t
  • 如何获得句子文本中二元组的概率?

    我有一篇文章 其中有很多句子 我该如何使用nltk ngrams来处理它 这是我的代码 sequence nltk tokenize word tokenize raw bigram ngrams sequence 2 freq dist
  • “ng-reflect-*”属性在 Angular2/4 中起什么作用?

    这里我在 Angular4 应用程序中有一个复杂的数据结构 它是一个有向多重图 在节点和链接上都用字典进行参数化 我的角度组件正在研究这个复杂的数据模型 在 Angular2 4 中 一切正常 自从我们切换到 Angular4 后 我将其添
  • 如何优化 llvm 链接时间

    我编译一个 C 程序 例如使用以下代码 clang O4 emit llvm file1 cpp c o file1 bc clang O4 emit llvm file2 cpp c o file2 bc llvm link file1
  • Django:更新数据库架构而不丢失数据

    如果我想升级 更改 我的数据库架构 通过将新字段添加到 Django 模型中来将新字段添加到表中 而不丢失这些表中的数据 最好的解决方案是什么 syncdb 当然不会添加它们 所以我需要您的建议如何更改表而不删除它们并使用syncdb再次重
  • 使用侧列表托盘嵌入 YouTube 播放列表

    我一直在使用 javascript 使用 youtube 嵌入播放列表功能 到目前为止 当我嵌入播放列表时 它看起来像这样 http postimage org image vk6fv56yx 蓝色圆圈显示播放列表中的项目数 单击时会显示缩
  • 如何仅比较 EF 中 DateTime 的日期组件?

    我有两个日期值 一个已存储在数据库中 另一个由用户使用 DatePicker 选择 用例是从数据库中搜索特定日期 先前在数据库中输入的值始终具有 12 00 00 的时间部分 而从选择器输入的日期具有不同的时间部分 我只对日期部分感兴趣 想
  • 如何使用 root 在 Android 4.2 及更高版本上切换飞行模式?

    众所周知 在 Android 4 2 上 只有系统应用程序可以切换飞行模式 但我认为它必须适用于 root 设备 我想在我的应用程序中将其实现为具有 Build VERSION SDK INT gt 17 的 root 设备 如何在 And
  • 根据一组关键字进行搜索

    我需要根据一组关键字进行搜索 返回与这些关键字相关的所有广告 然后结果是一个类别列表 其中包含每个类别的广告计数 搜索是在 KeywordSearch 表中进行的 public class KeywordSearch public int
  • 我可以在不使用 Array 构造函数或数组文字的情况下创建 Array.isArray() 返回 true 的对象吗?

    我可以通过将其原型设置为轻松使普通对象看起来像数组Array prototype const obj Reflect setPrototypeOf obj Array prototype 我知道魔法也存在一些问题length属性和稀疏数组
  • 使用 UIScreenEdgePanGestureRecognizer 而不移动 MKMapView

    我有一个包含 MKMapView 的 UIViewController 事实上 它包含一个包含 MKMapView 的全屏容器 但它不应该有任何影响 我实现了一个 UIScreenEdgePanGestureRecognizer 以显示抽屉
  • Quantmod add_TA 和 Chart_Series 出现问题 - 调用下一个 add_TA 后线条和文本消失

    我正在使用新的chart Series and add TA非常多 它对我来说非常有效 我发现它非常有用 我正在尝试在图表上添加一些内容 水平线和一些文本 这里开始出现问题 正确绘制水平线和文本后 如果我调用后续命令 它们就会消失add T
  • Cassandra控制SSTable大小

    有没有办法控制 SSTable 的最大大小 例如 100 MB 这样当 CF 实际上有超过 100MB 的数据时 Cassandra 就会创建下一个 SSTable 不幸的是 答案并不那么简单 SSTable 的大小将受到压缩策略的影响 并
  • C语言中的限定符是什么?

    我正在这个网址阅读一些文字 https cs senecac on ca btp100 pages content varia p html 在 限定符 部分中 他们说 我们可以限定 int 类型以确保它包含最少位数 Short 至少包含
  • 在 ANSI C 中正确声明 main() 函数 [重复]

    这个问题在这里已经有答案了 C标准说 程序启动时调用的函数 被命名为主 实施情况 没有为此声明原型 功能 它应定义为 返回类型为 int 并且没有 参数 int main void 或带有两个参数 参考 这里作为 argc 和 argv 尽
  • 如何在 Isabelle/jEdit 中启用“跟踪”

    I m a vim风扇 但仅emacs有这个 Isabelle HOL 环境 jEdit很棒 但我不能使用 using simp trace true like in emacs 如何启用 跟踪 jEdit 你确实可以使用simp trac
  • 将函数应用于多维数组:R 与 MATLAB

    这个问题可以被认为与this one 这帮助我提高了 R 在计算大数组平均值时的性能 不幸的是 在这种情况下 我尝试应用更复杂的东西 例如分位数计算 我有一个包含超过 4000 万个元素的 4 维数组 我想计算特定维度上的第 66 个百分位