将 Rcpp 对象分配到 Rcpp 列表中会产生最后一个元素的重复项

2023-12-14

我正在尝试采取Rcpp::CharacterMatrix并将每一行转换为它自己的元素Rcpp::List.

然而,我为此编写的函数有一个奇怪的行为,其中列表的每个条目对应于矩阵的最后一行。为什么会这样呢?这是一些与指针相关的概念吗?请解释。

功能:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
List char_expand_list(CharacterMatrix A) {
  CharacterVector B(A.ncol());

  List output;

  for(int i=0;i<A.nrow();i++) {
    for(int j=0;j<A.ncol();j++) {
      B[j] = A(i,j);
    }

    output.push_back(B);
  }

  return output;
}

测试矩阵:

这是矩阵A传递给上述函数。

mat = structure(c("a", "b", "c", "a", "b", "c", "a", "b", "c"), .Dim = c(3L, 3L))
mat
#     [,1] [,2] [,3]
# [1,] "a"  "a"  "a" 
# [2,] "b"  "b"  "b" 
# [3,] "c"  "c"  "c"

Output:

上面的函数应该将此矩阵作为输入并返回矩阵行的列表,如下所示:

char_expand_list(mat)
# [[1]]
# [1] "a" "a" "a"
#
# [[2]]
# [1] "b" "b" "b"
#
# [[3]]
# [1] "c" "c" "c"

但相反,我得到了不同的东西:

char_expand_list(mat)
# [[1]]
# [1] "c" "c" "c"
#
# [[2]]
# [1] "c" "c" "c"
#
# [[3]]
# [1] "c" "c" "c"

可以看出,输出具有最后一个元素,例如“c”的矩阵行,对第一个和第二个列表元素重复。为什么会发生这种情况?


这里发生的事情很大程度上是 Rcpp 对象工作方式的结果。 尤其,CharacterVector充当指向内存位置的指针。 通过在外部定义该内存位置for循环,结果是 “全局”指针。也就是说,当更新到B发生在循环中 这随后更新了所有变体B已方便地存储在Rcpp::List。因此,重复的行"c"自始至终 列表。

话虽这么说,这是一个非常非常非常bad使用的想法.push_back() on any Rcpp数据类型,因为您最终将在不断扩展的对象之间进行复制。当 Rcpp 数据类型隐藏底层时,就会发生复制SEXP控制 R 对象,必须重新创建该对象。因此,您应该尝试以下方法之一:

  • 重新排列一下Rcpp::CharacterVector被创建在第一个内部for循环并预分配Rcpp::List space.
  • Switch to using only C++ standard library objects and convert at the end to the appropriate type.
    • std::list with std::vector<T> type T (i.e. std::string)
    • Rcpp::wrap(x)返回正确的对象或修改函数返回类型Rcpp::List to std::list<std::vector<T> >.
  • 预分配Rcpp::List空间和使用std::vector<T> type T (i.e. std::string).
  • 预分配Rcpp::List空间并制作一个clone()在将 Rcpp 对象存储到列表之前。

Option 1

这里我们通过移动声明来重新排列函数B进入 第一个循环,预分配列表空间,并正常访问输出列表。

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
Rcpp::List char_expand_list_rearrange(Rcpp::CharacterMatrix A) {
  Rcpp::List output(A.nrow());

  for(int i = 0; i < A.nrow(); i++) {
    Rcpp::CharacterVector B(A.ncol());

    for(int j = 0; j < A.ncol(); j++) {
      B[j] = A(i, j);
    }

    output[i] = B;
  }

  return output;
}

Option 2

这里我们删除了Rcpp::CharacterVector有利于std::vector<std::string>并替换为Rcpp::List for std::list<std::vector<std::string> >。最后,我们将标准对象转换为Rcpp::List via Rcpp::wrap().

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
Rcpp::List char_expand_std_to_list(Rcpp::CharacterMatrix A) {
  std::vector<std::string> B(A.ncol());

  std::list<std::vector<std::string> > o;

  for(int i = 0 ;i < A.nrow(); i++) {
    for(int j = 0; j < A.ncol(); j++) {
      B[j] = A(i, j);
    }

    o.push_back(B);
  }

  return Rcpp::wrap(o);
}

Giving:

mat = structure(c("a", "b", "c", "a", "b", "c", "a", "b", "c"), .Dim = c(3L, 3L))
char_expand_std_to_list(mat)
# [[1]]
# [1] "a" "a" "a"
#
# [[2]]
# [1] "b" "b" "b"
#
# [[3]]
# [1] "c" "c" "c"

Option 3

或者,您可以致力于保持Rcpp::List,但只需声明大小 它提前期待并仍然使用std::vector<T>元素。

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
Rcpp::List char_expand_list_vec(Rcpp::CharacterMatrix A) {
  std::vector<std::string> B(A.ncol());

  Rcpp::List o(A.nrow());

  for(int i = 0; i < A.nrow(); i++) {
    for(int j = 0; j < A.ncol(); j++) {
      B[j] = A(i, j);
    }

    o[i] = B;
  }

  return o;
}

Option 4

最后,通过为列表预定义空间,可以显式克隆该列表 每次迭代时的数据。

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
Rcpp::List char_expand_list_clone(Rcpp::CharacterMatrix A) {
  Rcpp::CharacterVector B(A.ncol());
  Rcpp::List output(A.nrow());

  for(int i = 0; i < A.nrow(); i++) {

    for(int j = 0; j < A.ncol(); j++) {
      B[j] = A(i, j);
    }

    output[i] = clone(B);
  }

  return output;
}

基准

基准测试结果表明Option 1通过重新排列和预分配 的空间表现最好。亚军第二名是Option 4, 哪个 涉及在将每个载体保存到Rcpp::List.

library("microbenchmark")
library("ggplot2")

mat = structure(c("a", "b", "c", "a", "b", "c", "a", "b", "c"), .Dim = c(3L, 3L))

micro_mat_to_list = 
  microbenchmark(char_expand_list_rearrange(mat),
                 char_expand_std_to_list(mat),
                 char_expand_list_vec(mat),
                 char_expand_list_clone(mat))
micro_mat_to_list
# Unit: microseconds
#                             expr   min     lq    mean median     uq    max neval
#  char_expand_list_rearrange(mat) 1.501 1.9255 3.22054 2.1965 4.8445  6.797   100
#     char_expand_std_to_list(mat) 2.869 3.2035 4.90108 3.7740 6.4415 27.627   100
#        char_expand_list_vec(mat) 1.948 2.2335 3.83939 2.7130 5.2585 24.814   100
#      char_expand_list_clone(mat) 1.562 1.9225 3.60184 2.2370 4.8435 33.965   100

Benchmark plot

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

将 Rcpp 对象分配到 Rcpp 列表中会产生最后一个元素的重复项 的相关文章

  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • 如何动态设置 IFrame 的源?

    我有一个嵌入 YouTube 视频的 IFrame 我想创建一个文本框 用户 管理员 可以在其中粘贴新的视频源 URL 并且 IFrame 获取新源 这是我到目前为止所拥有的 protected void Edited Click obje
  • phpMyAdmin:日期字段显示为 BLOB

    我正在运行 phpMyAdmin 版本 4 4 4 浏览表时 所有 DATETIME 和 DATE 字段都显示为 斑点19 我单击了表格列表上方的 Options 选择 显示 BLOB 内容 并单击 GO 但是所有日期字段仍显示为 BLOB
  • 如何使用Camera API实现慢动作和延时视频录制

    有没有办法使用Camera API实现慢动作和延时录制 我尝试使用MediaRecorder环境VideoFrameRate VideoBitRate VideoCaptureRate但对我来说没有任何作用 我已经成功地使用 JNI 实现了
  • 将矩阵中的 0 替换为 NA

    用 NA 替换矩阵中的所有零的最有效方法是什么 我做什么 my matrix my matrix 0 lt NA 我需要它用于推荐系统 推荐实验室 填充 NA 与构建推荐系统的时间相同 EDIT 1 暗淡 my matrix 500000x
  • 罢工行为

    int main char str kk 12 23 4 3434 3 33 char valarr int count 0 valarr strtok str while valarr 0 valarr strtok NULL count
  • Python,mysql.connector 错误:没有可从中获取的结果集; cgitb 显示传递给函数的正确值

    好吧 这个让我感到困惑 所以我决定看看是否可以在这里找到答案 我上下搜索了几个 stackoverflow 问题和答案 但似乎没有任何效果 我想做的就是使用 mysql connector 执行 SELECT FROM 语句 但我不断收到
  • knockoutjs 数据绑定与 jquery-ui datepicker

    我正在使用一个jQuery用户界面日期选择器 它后面的 HTML 输入字段当前连接到淘汰赛作为 dependentObservable 但是当在视图模型中设置其值时 日期选择器会丢失其格式 我应该如何做而不丢失格式 我希望 viewMode
  • 无法连接到 ASP.Net 开发服务器问题

    我正在调试Codeplex简单项目 我在用 2008年VSTS C Windows Vista x86 企业版 我没有修改这个codeplex项目的任何代码 只需按F5即可运行VideoPlayerWeb项目 我当前遇到的问题是错误消息 无
  • 当应用程序处于后台时 Android 通知

    我正在从 google firebase 为我的 android 应用程序发送推送通知 目标为 Android 5 0 我的推送通知代码是 Override public void onMessageReceived RemoteMessa
  • Eclipse 插件中动态生成的 TestNG 测试的名称

    我使用一个动态生成的 JUnit 测试套件转换为 TestNG Factory注解 测试是通过扫描包含多个测试规范文件 以 DSL 编写 的目录并将它们加载到知道如何执行它们的测试类中来生成 的 测试类有一个 Test方法名为test 实现
  • php preg_replace 为 Unicode 字符

    我有一个类似这个问题的问题 php 预替换 在这个问题中 他 她只想允许字母 数字和 但我只想允许数字 字母和Unicode 非拉丁语 字母和数字 我想 我应该使用这个的 Unicode 值 例如U 1F70 我能做些什么 谢谢 您应该使用
  • 如何使用 Bluebird.js nodeify 将第三个参数传递给回调

    在一点帮助下我已经得到以下代码来承诺Passport js 登录策略 var passport require passport var LocalStrategy require passport local Strategy var P
  • Magento:SQLSTATE [42000]:语法错误或访问冲突:1044 用户'DBUSER'@'%'对数据库'DBNAME'的访问被拒绝

    几个小时以来 我一直在为这个问题而苦苦挣扎 有人可以帮忙吗 我在网上找不到任何有关它的信息 我已经安装了最新版本的 magento 并添加了一些商店和简单的产品 在尝试将关联产品添加到可配置产品之前 一切似乎都工作正常 它允许我添加可配置产
  • 在 IIS 7 上使用 HttpHandler 取消请求验证

    我有一个应用程序必须处理在其 URL 中获取 特殊 字符 如 等 当我使用这些字符向应用程序发送请求时 当然我发送的是转义字符 我收到 错误请求 响应代码 并显示消息 ASP NET 在 URL 中检测到无效字符 跟踪请求表明错误是从 身份
  • PHP5.3.0 的 Pear 错误消息

    当我在 WAMP 服务器上打开新安装的 PEAR 包时 出现很多错误 这是错误消息 我能做些什么 Deprecated Assigning the return value of new by reference is deprecated
  • 基于 ngx.re.match() 添加自定义标头

    我正在尝试添加基于的自定义标头uri值 在这种情况下对于所有pdf files header filter by lua block local m err ngx re match ngx var uri pdf io if m then
  • 背景附件的替代方案:固定

    由于background attachment fixed在某些移动浏览器上不起作用 例如在iOS上 有哪些替代方案 特别是在尝试实现以下演示时 http cppforums ludost net test test html CSS se
  • Numpy 高级索引:在 += 中多次使用相同的索引 [重复]

    这个问题在这里已经有答案了 假设您有以下代码 a np ones 8 pos np array 1 3 5 3 a pos returns array 1 1 1 1 where the 2nd and 4th el are the sam
  • 使用 qsort 对 2D 数组进行排序

    我正在尝试对二维数组进行排序 首先我按列排序 然后按行排序 逐列有效 但逐行无效 这段代码有什么问题 int scmpr const void a const void b return strcmp const char a const
  • 将 Rcpp 对象分配到 Rcpp 列表中会产生最后一个元素的重复项

    我正在尝试采取Rcpp CharacterMatrix并将每一行转换为它自己的元素Rcpp List 然而 我为此编写的函数有一个奇怪的行为 其中列表的每个条目对应于矩阵的最后一行 为什么会这样呢 这是一些与指针相关的概念吗 请解释 功能