如何在 R 中执行*快速* DCT(离散余弦变换)?

2024-02-25

使用 Rprof 发现 dtt 包中的 dct 是一段运行速度相当缓慢的 R 代码中的主要罪魁祸首。将其替换为 stats 包中的 fft(这不是相同的转换,但应该花费相同的时间来计算),我的运行时间显着提高。事实上,我的 Rprof 线路中有 2/3 以前是 dct 调用,而在切换后只有 3 行(约 600 行)是 fft 调用。

dtt 包中的 dct 实现是否未使用fast离散傅里叶变换?如果有的话,有没有一个包有这个? (我知道可以将数据加倍,然后从这些 fft 系数中提取 dct 系数,但是直接快速 dct 肯定会更好,而且确实有ought成为某个地方的一员)。


似乎没有快速 DCT,但 stats 包中有一个 FFT(快速傅立叶变换),因此以下是如何使用 FFT 获得快速 DCT。

使用此功能需要您自担风险。我没有做过任何认真的检查。我在几个不同大小的向量上检查了它,它给出了与 dtt 包中的函数 dct 相同的结果。如果有人想通过将其与 dct 的输出进行比较来仔细检查我,那么请随意这样做并发布您的结果。

将向量扩展为两倍长的向量,如下所示:如果向量为 v=(1,2,3),则将条目加倍为 w=(1,2,3,3,2,1)。注意顺序。如果你的向量是 v=(1,2,4,9) 则将条目加倍为 w=(1,2,4,9,9,4,2,1)

令 N 为原始向量的长度(在将其长度加倍之前)。

那么前 N 个系数 .5 * fft(w)/exp(复数(虚数=pi / 2 / N)*(seq(2*N)-1)) 应该同意计算 DCT(v) 但在几乎所有情况下它应该要快得多。

速度考虑因素。如果您对质因数 N 进行计算,则计算快速 dct 所需的时间就像对每个质因数进行慢速 dct 所需的时间一样。因此,如果 N 是 2^K,就像对长度为 2 的向量进行 K 个不同的慢速 dct 变换,所以它really快速地。如果 N 是素数(最坏情况),则根本没有加速。最大的加速是在长度为 2 的幂的向量上。

注意:上面的 R 代码看起来非常不友好,所以让我说一下发生了什么。以正确的方式将长度加倍后,得到的 fft 的前 N ​​个系数是almost正确的事情。然而,系数需要稍微调整。令 P 代表 e^(pi * i / 2 / N)。保留第一个系数。将第二个系数除以 P,将第三个系数除以 P^2,将第四个系数除以 P^3,依此类推...然后除以all将系数除 2(包括第一个)以与 R 用于 DCT 的归一化一致。

This should提供与使用 dtt 包中的 dct 函数相同的功能,但几乎在所有情况下速度都要快得多。

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

如何在 R 中执行*快速* DCT(离散余弦变换)? 的相关文章

  • 运行 R.exe 会创建临时文件吗?

    我在想 是否启动 R exewindows创建临时文件并 是否解释类似x lt 5写入那些临时文件 如果创建了临时文件 它们存储在哪里 如果我启动多个 R exe 实例会发生什么情况 他们会共享并覆盖彼此的临时文件吗 R 的每个实例都有自己
  • R 中多类分类的 ROC 曲线

    我有一个包含 6 个类别的数据集 我想绘制多类别分类的 ROC 曲线 Achim Zeileis 给出的第一个答案非常好 R中使用rpart包的ROC曲线 https stackoverflow com questions 30818188
  • 从 foreach 循环赋值

    我想并行化一个循环 例如 td lt data frame cbind c rep 1 4 2 rep 1 5 rep 1 10 2 names td lt c val id res lt rep NA NROW td for i in l
  • 将值添加到 rCharts hPlot 工具提示

    我想通过 rCharts 向标准 Highcharts 工具提示添加一些额外的值 示例代码 require rCharts df lt data frame x c 1 5 y c 5 1 z c A B C D E name c K L
  • R:如何添加具有从矩阵的每一行中随机选择的值的列?

    我会先说我是一个 R 菜鸟 我认为这可能有一个简单的解决方案 但我正在努力寻找它 我有一个 2 列 1 000 行的矩阵 保持行固定 我想创建一个新变量 从两列中随机选择一个元素 例如制作一个简单的矩阵 matrix c 1 1 4 6 1
  • 从 data.frame 创建新列

    我有一个长格式的数据集 其中测量 时间 嵌套在 Networkpartners NP 中 而 Networkpartners NP 又嵌套在人员 ID 中 下面是它的示例 真实数据集有数千行 ID NP Time Outcome 1 11
  • xml2 包 (R) 中的 xml_find_all 函数未找到相关节点

    我使用 R 中的 xml2 包来访问 xml 数据 发现它在不同的 xml documents 上表现不同 在这个宠物的例子中 library xml2 doc lt read xml
  • 为什么安装的“igraph”包在加载后返回“libicui18n.so.58:无法打开共享对象文件”?

    我试图使用命令 install packages igraph 在 R 中安装 igraph 包 安装后 在测试阶段出现以下错误 测试是否可以加载已安装的包错误 包或命名空间 dyn load file DLLpath DLLpath 中的
  • 用于更改向量中元素顺序的闪亮小部件

    在很多网站上 您都有一个拖放界面来更改列表中元素的顺序 我正在寻找类似的东西闪亮 我希望用户能够拖放列表中的元素 通过更改顺序来更改优先级 现在我有一个滥用的解决方案selectizeInput 这是可行的 但当选择列表变得更大时 它很快就
  • R:邻接表到邻接矩阵

    Bonjour 我想将邻接列表 3 列 转换为邻接矩阵 在这个论坛中 我找到了多个有关如何将边列表转换为邻接矩阵的示例 我成功地为两列列表做到了这一点 我已经尝试了在网上可以找到的所有解决方案 但似乎我错过了一小步 我尝试过的 我的变量是用
  • r - 从我的应用程序下载shinyapps代码

    我正在尝试从shinyapps io 在另一台电脑上下载我的shiny 应用程序代码 我按照这个例子 https support rstudio com hc en us articles 204536588 从 shinyapps io下
  • R 中使用 randomForest 进行内存高效预测

    TL DR我想知道使用基于大型数据集 数百个特征 数十万行 构建的随机森林模型执行批量预测的内存有效方法 Details 我正在处理一个大型数据集 内存中超过 3GB 并且想要使用以下方法进行简单的二进制分类randomForest 由于我
  • 如何将环境变量传递给shinyapps

    我想将安全参数传递给shinyapps io部署 以便我的应用程序可以通过以下方式获取它们 Sys getenv PASSWORD X 我找不到任何相关内容deployApp函数在rsconnect包裹 您可以使用Renviron网站 or
  • 粘贴两个 data.table 列

    dt lt data table L 1 5 A letters 7 11 B letters 12 16 L A B 1 1 g l 2 2 h m 3 3 i n 4 4 j o 5 5 k p 现在我想粘贴列 A 和 B 以获得一个新
  • plot xts if (on == "years") { 中的错误:缺少 TRUE/FALSE 需要的值

    我正在尝试绘制 xts 对象 但出现有关年份的错误 xts 对象只有一个数值和一个 POSIXct 索引 下面的代码显示了 xts 和尝试绘图时的错误 关于需要对 xts 对象做什么才能正确绘制的任何想法 xTest lt as xts 3
  • 当我用一个观察值运行回归时,为什么“fastLm()”会返回结果?

    为什么fastLm 当我用一项观察进行回归时返回结果吗 下面为什么不lm and fastLm 结果相等吗 library Rcpp library RcppArmadillo library data table set seed 1 D
  • R 中的 huxtable 即使有选项也默认为科学记数法(scipen=999)

    我试图生成像样的桌子 并在过去的一周尝试了很多软件包 我的头在游泳 今天早上开始使用 package huxtable 并试图摆脱科学记数法 x lt mtcars 1 5 1 2 x mpg lt x mpg 10000000 get s
  • 如何在r中进行左连接[重复]

    这个问题在这里已经有答案了 我有两个数据集一和二 数据集一 a b c 111 a 1 112 b 2 113 c 3 114 d 4 115 e 5 数据集二 e d g 222 ss 11 111 ff 22 113 ww 33 114
  • 如何在RcppParallel中调用用户定义的函数?

    受到文章的启发http gallery rcpp org articles parallel distance matrix http gallery rcpp org articles parallel distance matrix 我
  • R Leaflet:添加多边形时传递 popupOptions。

    Within addPolygons 有一个popup参数就像addPopups 功能 区别 我认为 是当弹出窗口创建时addPolygons 可以单击多边形内的任意位置来触发弹出窗口 但是如果addPopups 被使用 单个lng and

随机推荐