与逻辑语句匹配的 Rcpp 矩阵的子集

2023-12-19

在 R 中,如果我们有一个数据矩阵,比如一个 100 x 10 矩阵 X,以及一个具有可能值 (0, 1, 2, 3) 的 100 元素向量 t,我们可以使用简单的方法轻松找到 X 的子矩阵 y句法:

y = X[t == 1, ]

但是,问题是,我如何使用 Rcpp 的 NumericMatrix 做到这一点?
(或者,更一般地说,我如何在 C++ 的任何容器中做到这一点?)

多亏了德克的提示,看来

NumericMatrix X(dataX);
IntegerVector T(dataT);
mat Xmat(X.begin(), X.nrow(), X.ncol(), false);
vec tIdx(T.begin(), T.size(), false); 
mat y = X.rows(find(tIdx == 1));

可以做我想做的事,但这似乎太长了。


我很想把它看作糖。不幸的是,我没有资格实施它。这里仍然有一些我使用过的不同解决方案。

首先,我必须对Gong-Yi Liao 代码进行一些修改才能使其正常工作(colvec代替vec for tIdx and Xmat.rows(...代替X.rows(...:

mat Xmat(X.begin(), X.nrow(), X.ncol(), false);
colvec tIdx(T.begin(), T.size(), false); 
mat y = Xmat.rows(find(tIdx == 1));

其次,这里有三个函数,其所有子集矩阵都基于逻辑语句。这些函数采用 arma 或 rcpp 参数并返回值。其中两个基于 Gong-Yi Liao 的解决方案,一个是基于简单循环的解决方案。

n(行)=100, p(T==1)=0.3

                expr   min     lq median     uq    max
1  submat_arma(X, T) 5.009 5.3955 5.8250 6.2250 28.320
2 submat_arma2(X, T) 4.859 5.2995 5.6895 6.1685 45.122
3  submat_rcpp(X, T) 5.831 6.3690 6.7465 7.3825 20.876
4        X[T == 1, ] 3.411 3.9380 4.1475 4.5345 27.981

n(行)=10000, p(T==1)=0.3

                expr     min       lq   median       uq      max
1  submat_arma(X, T) 107.070 113.4000 125.5455 141.3700 1468.539
2 submat_arma2(X, T)  76.179  80.4295  88.2890 100.7525 1153.810
3  submat_rcpp(X, T) 244.242 247.3120 276.6385 309.2710 1934.126
4        X[T == 1, ] 229.884 236.1445 263.5240 289.2370 1876.980

子mat.cpp

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp;
using namespace arma;

// arma in; arma out
// [[Rcpp::export]]
mat submat_arma(arma::mat X, arma::colvec T) {
    mat y = X.rows(find(T == 1));
    return y;
}

// rcpp in; arma out
// [[Rcpp::export]]
mat submat_arma2(NumericMatrix X, NumericVector T) {
    mat Xmat(X.begin(), X.nrow(), X.ncol(), false);
    colvec tIdx(T.begin(), T.size(), false); 
    mat y = Xmat.rows(find(tIdx == 1));
    return y;
}

// rcpp in; rcpp out
// [[Rcpp::export]]
NumericMatrix submat_rcpp(NumericMatrix X, LogicalVector condition) { 
    int n=X.nrow(), k=X.ncol();
    NumericMatrix out(sum(condition),k);
    for (int i = 0, j = 0; i < n; i++) {
        if(condition[i]) {
            out(j,_) = X(i,_);
            j = j+1;
        }
    }
    return(out);
}


/*** R
library("microbenchmark")

# simulate data
n=100
p=0.3
T=rbinom(n,1,p)
X=as.matrix(cbind(rnorm(n),rnorm(n)))

# compare output
identical(X[T==1,],submat_arma(X,T))
identical(X[T==1,],submat_arma2(X,T))
identical(X[T==1,],submat_rcpp(X,T))

# benchmark
microbenchmark(X[T==1,],submat_arma(X,T),submat_arma2(X,T),submat_rcpp(X,T),times=500)

# increase n
n=10000
p=0.3
T=rbinom(n,1,p)
X=as.matrix(cbind(rnorm(n),rnorm(n)))
# benchmark
microbenchmark(X[T==1,],submat_arma(X,T),submat_arma2(X,T),submat_rcpp(X,T),times=500)

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

与逻辑语句匹配的 Rcpp 矩阵的子集 的相关文章

  • 检测wlan是否关闭

    任何人都可以给我一个提示 如何在 Windows Phone 上以编程方式检测 C 8 1 应用程序 不是 8 0 是否启用 禁用 WLAN 我不想更改这些设置 只是需要知道 该解决方案是一个 Windows 8 1 通用应用程序 Wind
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • 计算另一个表达式中的 C# 表达式

    我想在另一个表达式中使用一个表达式 Expression
  • 一元 +/- 运算符如何可能导致“-a”或“+a”中的整数提升,“a”是算术数据类型常量/变量?

    这句看似微不足道的台词摘自我的迈克 巴纳汉和布雷迪的 C 书 第 2 8 8 2 节 http publications gbdirect co uk c book chapter2 expressions and arithmetic h
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • 将表(行)与 OpenXML SDK 2.5 保持在一起

    我想在 Word 文档中生成多个表 每行 2 行 但我想将这两行保留在一起 如果可能的话 new KeepNext 第一行不起作用 new KeepNext 第一行的最后一段不起作用 new CantSplit 放在桌子上不起作用 在所有情
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 从 SpatialPolygons 和其他 sp 类中提取要素坐标

    Package sp为不同的空间概念 点 线 多边形 提供了许多类 对于某些类 访问要素坐标很简单 例如SpatialLines 所有示例均取自相应课程的帮助页面 l1 cbind c 1 2 3 c 3 2 2 l1a cbind l1
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • 时间序列,将月度数据改为季度

    现在我有一些每月数据 例如 1 1 90 620 2 1 90 591 3 1 90 574 4 1 90 542 5 1 90 534 6 1 90 545 etc 如果我使用 ts 函数 很容易将数据转换为时间序列结构 例如 Jan F
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • 如何得知客户端从服务器的下载速度?

    根据客户的下载速度 我想以低质量或高质量显示视频 任何 Javascript 或 C 解决方案都是可以接受的 Thanks 没有任何办法可以确定 您只能测量向客户端发送数据的速度 如果没有来自客户端的任何类型的输入来表明其获取信息的速度 您
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc
  • 在并行包中的 R 的 par*apply 函数内部使用 Rcpp 函数

    我试图了解背后发生的事情Rcpp sourceCpp 调用并行环境 最近 问题中部分解决了这个问题 在 Windows 上使用 parLapply 中的 Rcpp 函数 https stackoverflow com questions 2

随机推荐

  • Javascript随机化数组,而起始位置没有元素[重复]

    这个问题在这里已经有答案了 我有一个 JavaScript 问题 我让用户输入一个名称列表 然后将其放入一个数组中 长话短说 我正在编写一种随机方法 让人们弄清楚他们将为谁购买圣诞礼物 例如 原始数组由以下名称组成 Alex Joel Li
  • 合并具有相同键的元组

    如何合并具有相同键的元组 list 1 AAA 123 AAA 456 AAW 147 AAW 124 并将它们变成 list 2 AAA 123 456 AAW 147 124 最有效的方法是使用collections defaultdi
  • Django中的send_mail,在shell中工作,在本地工作,不在视图中

    我什至不知道如何调试这个 我在 Django 的一个视图中使用 send mail 在本地使用该应用程序时 使用与我在生产中使用的相同的 SMTP 设置 它可以正常工作 并且在生产中的 shell 中也可以正常工作 同样 使用相同的设置 但
  • 当标题拆分为两行时修复plotly ggplotly() 标题重叠图

    在下面的示例中 标题的第二行与情节略有重叠 有没有办法通过增加标题和情节之间的间距来解决这个问题 library ggplot2 library plotly library magrittr p1 lt ggplot iris aes x
  • 如何使用 $.ajax(jQuery 或 Zepto)发布对象数组

    我想在 Zepto 或 Jquery 中使用 ajax 发布一组对象 两者都表现出相同的奇怪错误 但我找不到我做错了什么 当使用像 RestEasy 这样的测试客户端发送数据时 数据会保存到服务器 并且我可以看到请求在浏览器的网络面板中被破
  • 使用 Tor 运行 Puppeteer

    我安装了 Tor Expert Bundle 并且想使用 Puppeteer 运行它 I try const browser await puppeteer launch headless false args proxy server s
  • 更新后 Fabric 崩溃:[Fabric isCrashlyticsCollectionEnabled]:无法识别的选择器发送到类 0x10c0bb918

    今天 pod 更新后 Fabric 崩溃了 面料1 9 0 Fabric isCrashlyticsCollectionEnabled unrecognized selector sent to class 0x10c0bb918 崩溃线
  • Linux系统调用

    我能够获得系统调用的执行及其在内核中的处理 但我还不清楚一些事情 进入 swi 例程后 内核保存 用户模式寄存器在堆栈上 问题是 是谁的堆栈 因为 swi 处理和相应的系统调用例程需要堆栈帧来工作 如果是内核自己的堆栈 那么从哪里分配堆栈
  • 为什么数据流步骤无法启动?

    我有一个线性三步数据流管道 由于某种原因 最后一步开始 但前面的两个步骤挂起Not started在我放弃并终止这份工作之前很长一段时间 我不确定是什么导致了这个问题 因为同样的管道过去曾成功运行过 而且我很惊讶它没有在日志中显示任何阻止前
  • 更改成员资格连接字符串

    我是 ASP NET 成员资格新手 我需要帮助以编程方式更改其连接字符串 到目前为止我尝试过的是 我创建了一个类项目名称 Sample 作为命名空间 并扩展了System Web Security SqlMembershipProvider
  • C++中接口类和实现类的并行继承

    我正在尝试以与 Java 接口类似的方式使用 C 抽象基类 假设我们有以下仅具有纯虚函数的接口类 class Shape virtual double area 0 class Square public Shape virtual voi
  • 最简单的反向代理[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在寻找一种方法来简单地在本地设置连接到远程站点的代理 我不想在系统中正确安装任何东西 如果我可以使用单个命令行调用来调用它 而不是使用单个配置文件
  • 选择一个数据框中与另一数据框中部分匹配的行

    我希望在一个数据框中选择行 data 1 部分匹配第二个数据帧中的行 keep these 得到desired result 我在这里发现了几个基于一列匹配的问题 但我想在三列上匹配 STATE COUNTY and CITY 到目前为止
  • 在 Eclipse-Java EE 上,如何更改树视图上选定元素的颜色设置?

    我最近在 Eclipse Java EE Luna 上切换到深色主题 甚至尝试了其他深色主题 例如月出 但我总是最终不得不调整一些设置以便能够阅读内容 顺便说一下 我必须每次重新启动 Eclipse 时都会重新设置 我希望他们尽快解决该问题
  • 访问剪贴板的第 N 项

    有没有办法从剪贴板中检索多个项目 我正在使用这样的东西 Dim clipboard As MSForms DataObject Dim str1 As String Dim str2 As String Set clipboard New
  • MPI中如何知道进程正在哪个核心上运行?

    我目前正在开发一个项目 我需要知道 MPI 中当前运行进程的处理器的 coreid MPI中有一个函数叫做MPI Get processor name char name int resultlen 这仅给出进程正在运行的节点的名称 我想知
  • 如何清除v2谷歌地图中的所有标记?

    我需要清除 v2 谷歌地图中的所有标记 再次需要添加一些标记 如果有人知道答案 请分享您的想法 您可以使用googleMap clear https developer android com reference com google an
  • 如何在unix中仅替换>和<之间的一个换行符

    假设我有一条文字 this n is gt n lt 我想用 none 替换换行符 这将导致 this n is gt lt 如何实现这一目标 我尝试使用以下内容 echo this n is gt n lt sed e s gt n g
  • 选项卡栏图标选定的图像

    如何自定义标签栏上选定的图像 图标 这可能吗 请指教 谢谢 无需添加任何子视图即可实现 在定义选项卡栏的类中设置 tabBarItem 至 gt gt UITabBarItem tabBarItem1 self tabBar tabBar
  • 与逻辑语句匹配的 Rcpp 矩阵的子集

    在 R 中 如果我们有一个数据矩阵 比如一个 100 x 10 矩阵 X 以及一个具有可能值 0 1 2 3 的 100 元素向量 t 我们可以使用简单的方法轻松找到 X 的子矩阵 y句法 y X t 1 但是 问题是 我如何使用 Rcpp