Rcpp:处理 NumericMatrix 时,* 的语法糖会产生意想不到的结果

2023-12-07

最近被问到的一个问题让我相信语法糖* by Rcpp不按预期工作。在链接的问题中,用户试图将矩阵乘以标量。

R code

这就是我们想要实现的目标Rcpp,但现在简单地说R:

> m <- matrix(0:3, 2, 2)
> m * 3
     [,1] [,2]
[1,]    0    6
[2,]    3    9

RCPP代码

我创建了一些最小的示例来演示上述问题以及一些意外的行为。首先请注意,我一直在使用List作为返回类型,因为它不需要我提前声明适当的类型:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]

List FooMat() {
  // Create a fill a 2x2 matrix
  NumericMatrix tmp(2,2);
  for (int i = 0; i < 4; i++) {
    tmp[i] = i;
  }

  return List::create(tmp);
}

// [[Rcpp::export]]
List FooMat2() {
  // Create a fill a 2x2 matrix
  NumericMatrix tmp(2,2);
  for (int i = 0; i < 4; i++) {
    tmp[i] = i;
  }

  NumericVector x(1);                                                                                                                                                                                                                      
  x[1] = 3;

  return List::create(tmp * x); 
}

// [[Rcpp::export]]

List FooMat3() {
  // Create a fill a 2x2 matrix
  NumericMatrix tmp(2,2);
  for (int i = 0; i < 4; i++) {
    tmp[i] = i;
  }

  NumericVector x(1);
  x[1] = 3;

  return List::create(tmp * x[1]);
}

// [[Rcpp::export]]

List FooMat4() {
  // Create a fill a 2x2 matrix
  NumericMatrix tmp(2,2);
  for (int i = 0; i < 4; i++) {
    tmp[i] = i;
  }

  return List::create(tmp * 3); 
}

现在,如果我们获取该文件,我们会得到一些奇怪的行为:

# Proof that we can return a NumericMatrix in a List:
> FooMat()
[[1]]
     [,1] [,2]
[1,]    0    2
[2,]    1    3

# Multiply the whole NumericMatrix by a whole NumericVector
# whose size is 1. Unsafe behaviour?
> FooMat2()
[[1]]
[1]  0.000000e+00  3.000000e+00 1.388988e-309 2.083483e-309

# Multiply the whole NumericMatrix by the first element of
# The NumericVector. Results are correct, but `*` converts
# the answer to a NumericVector instead of a NumericMatrix
> FooMat3()
[[1]]
[1] 0 3 6 9

# Same as FooMat3() except now we just multiply the NumericMatrix
# by an integer
> FooMat4()
[[1]]
[1] 0 3 6 9

一、语法糖*由...提供Rcpp似乎无法正确处理矩阵与标量的乘法。二、乘以整数NumericVector, as in FooMat2()导致不安全行为。


正如我在之前的答案中所述,当我需要对矩阵进行实际数学计算时,我使用犰狳对象:

R> cppFunction('arma::mat scott(arma::mat x, double z) { 
+                 return(x*z); }', 
+              depends="RcppArmadillo")
R> scott(matrix(1:4,2), 2)
     [,1] [,2]
[1,]    2    6
[2,]    4    8
R> 

糖操作不错,但并不完整。不过,我们肯定会打补丁。

正如我们之前多次说过的:rcpp-devel 是正确的支持渠道。

Edit(2016 年 10 月或 2 1/2 年后):寻找其他东西让我回到了这里。在 Rcpp 0.12.* 系列中,一些工作涉及矩阵和向量之间的运算,因此基本的“矩阵乘标量”现在可以按您的预期工作:

R> cppFunction("NumericMatrix testmat(NumericMatrix m, double multme) { 
+               NumericMatrix n = m * multme; 
+               return n; }") 
R> testmat(matrix(1:4,2), 1)
     [,1] [,2]
[1,]    1    3
[2,]    2    4
R> testmat(matrix(1:4,2), 3)
     [,1] [,2]
[1,]    3    9
[2,]    6   12
R> 

不过,我可能仍然会使用 RcppArmadillo 进行矩阵数学运算。

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

Rcpp:处理 NumericMatrix 时,* 的语法糖会产生意想不到的结果 的相关文章

  • Rsolnp:在 cbind(temp, funv) 中:结果的行数不是向量长度的倍数(arg 1)

    我是 stackoverflow 的新手 搜索了很多 但找不到我的问题的答案 我正在尝试使用优化包 Rsolnp 来最小化以下问题 尽管求解器为我提供了解决方案 但每次运行代码时我都会收到以下警告消息 警告消息 1 在 cbind temp
  • 从 R 中的向量中选择所有可能的元组

    我正在尝试用 R 编写一个程序 当给定一个向量时 将返回所有可能的tuples http en wikipedia org wiki Tuples该向量中的元素 例如 元组 c a b c c a b c 出租车 c a c c b c c
  • 将命名参数列表传递给函数?

    我想编写一个小函数来从适当的分布生成样本 例如 makeSample lt function n dist params values lt makeSample 100 unif list min 0 max 10 values lt m
  • 如何在R中删除重复项

    我有一个非常大的数据集 如下所示 df lt data frame school c a a a b b c c c year c 3 3 1 4 2 4 3 1 GPA c 4 4 4 3 3 3 2 2 school year GPA
  • LDA with topicmodels,如何查看不同文档属于哪些主题?

    我正在使用 topicmodels 包中的 LDA 我已经在大约 30 000 个文档上运行它 获取了 30 个主题 并获得了主题的前 10 个单词 它们看起来非常好 但我想看看哪些文档属于哪个主题的概率最高 我该怎么做 myCorpus
  • 是否可以通过扫描从控制台读取而不回显字符?

    这是一个示例函数 passwordEntry lt function cat Enter your password pwd lt scan n 1 what character quiet TRUE invisible pwd 并测试该功
  • 使用 broom 和 tidyverse 总结 r 平方游戏

    我发布了一个问题here https stackoverflow com questions 48627287 getting adjusted r squared value for each line in a geom smooth
  • 删除ggplot2中的负图区域[重复]

    这个问题在这里已经有答案了 如何删除 ggplot2 中 x 轴和 y 轴下方的绘图区域 请参见下面的示例 我尝试了几个主题元素 panel border panel margin plot margin 但没有任何运气 p lt ggpl
  • 在shiny中过滤传单地图数据

    我在用传单地图设置这个闪亮的东西时遇到了麻烦 我的原帖 https stackoverflow com questions 50111566 applying leaflet map bounds to filter data within
  • R中的一元加/减是什么?

    来自 R 的详细信息部分Syntax http stat ethz ch R manual R patched library base html Syntax html帮助页面 定义了以下一元和二元运算符 他们被列出 在优先级组中 从最高
  • 如何删除箱线图上的刻度线

    我试图从箱线图中删除 x 轴刻度线 但保留与刻度线关联的标签 这在基础 R 中可能吗 colors lt c lightskyblue3 gray78 gold1 wheat1 boxplot avgscore module data mi
  • 在 R 中向散点图添加线条

    如何向图表添加线条 我做了以下 dat lt data frame xvar 1 20 rnorm 20 sd 10 yvar 1 20 rnorm 20 sd 10 zvar 1 20 rnorm 20 sd 10 plot dat 1
  • 如何计算R中移动窗口内的平均斜率

    我的数据集包含2个变量y 和 t 05s y 每 05 秒测量一次 我正在尝试计算移动中的平均坡度20秒窗口 即计算第一个 20 秒斜率值后 窗口向前移动一个时间单位 05 秒 并计算下一个 20 秒窗口 在以下位置生成连续 20 秒斜率值
  • 选择 R 中的数据表中隐藏时(在绿色加号下方)列的显示顺序

    Context 使用 DataTables 库制作交互式表格时 当屏幕宽度对于列的数量和宽度来说太窄时 列将隐藏在绿色 号下 我有一个非常宽的表格 有 20 多列 其中一些内容非常冗长 因此某些列在所有屏幕宽度下总是隐藏的 每次隐藏新列时
  • R独特的列或行与NA无可比拟

    有谁知道如果incomparables的论证unique or duplicated 曾经被实施过incomparables FALSE 也许我不明白它应该如何工作 无论如何 我正在寻找一个巧妙的解决方案 以仅保留与另一列相同的唯一列 或行
  • 以引用透明的方式从函数的省略号参数中提取符号

    事情又发生了 我正要按下发布答案按钮的问题被删除了 我正在寻找一种方法来从函数的省略号参数中提取绑定到符号的对象的值以及符号 也就是说 我试图以引用透明的方式从省略号中提取符号 我尝试过使用替代品和lazy dots 但没有成功 funct
  • 在 R 中使用 lapply 绘制多个数据帧

    我正在尝试使用 lapply 函数绘制多个数据帧 每个数据帧一个图 但是尽管有关此主题的所有帖子我都找不到答案 因为我不断收到错误 图的输出列表为空 我的数据结构如下 df1 lt mtcars gt group by cyl gt tal
  • ggplot2 geom_密度和geom_histogram在一个图中

    如何制作一个所有条形加起来为 1 的直方图 并在适合的上方添加一个密度层 set seed 1234 df lt data frame sex factor rep c F M each 200 weight round c rnorm 2
  • 旋转 Markdown 的表格 pdf 输出

    我想将 pdf 上的表格输出旋转 90 度 我正在使用 Markdown 生成报告并kable循环显示表格 如果可以的话我想继续使用kable因为还有很多其他依赖于它的东西我没有包含在这个 MWE 中 这是一个简单的例子 使用iris数据集
  • 如何仅删除单括号并保留配对的括号

    你好 我亲爱的老师 R 用户朋友们 我最近开始认真学习正则表达式 最近我遇到了一种情况 我们只想保留配对括号 并省略未配对的 这是我的样本数据 structure list t1 c Book Pg 1 Website Online Jou

随机推荐

  • 实际上从堆中为对象分配了多少内存?

    我有一个程序使用太多内存来在堆上分配大量小对象 所以我想研究一下优化它的方法 该程序使用Visual C 7编译 有没有办法确定为给定对象实际分配了多少内存 我的意思是当我打电话时new堆分配不小于必要的数量 我怎样才能知道到底分配了多少
  • 从 bash 脚本运行 makefile 命令并返回错误结果代码

    我有一个 python makefile 我可以从我的 bash 脚本运行它的命令 如下所示 local make lint output make lint output make test unit 2 gt 1 echo make l
  • 将 PHP 变量从一个页面传递到另一个页面,再传递到另一个页面 [重复]

    这个问题在这里已经有答案了 可能的重复 在 PHP 中将值从页面传递到另一个页面 例如 我有3页 第一页将是一个常规的 HTML 登录页面 将要求输入用户名 第二页将通过 POST 函数获取此用户名变量并分配一个 php 变量 例如 use
  • Worklight http 适配器问题

    2个简单的问题 通过 http 适配器发出的所有 http 请求是否都会首先通过 worklight 服务器 如果是这样 那么是否意味着即使是对公共网站的 http 适配器请求 例如对 yahoo 网站的股票价格请求 也会首先通过 work
  • 自定义 XYJfree 图表中的条形颜色

    如何用不同的颜色绘制不同的条形 我尝试使用渲染器 这是我的示例代码 public IntervalXYDataset createDataset throws InterruptedException parseFile final XYS
  • .NET Standard 2.0 使用的兼容性填充程序

    概述 example NET Standard 2 0 表示它现在使用某种兼容性填充程序来修复第三方库兼容性问题 因此 您可以将第三方库与 NET Standard 一起使用 直到它不使用 NET Standard 没有的任何 API 不清
  • 如果 iCloud 设置为不同步提醒,则无法创建本地 EKCalendar(提醒)

    这里遇到了一个非常奇怪的问题 在我看来这是 EventKit API 的问题 我只是想检查一下我没有做什么 测试用例1 在应用程序的隐私中启用提醒 该设备有 iCloud 帐户 但设置为不同步提醒 我可以创建一个localApple 的 提
  • 从列表集合中删除重复项

    希望可以有人帮帮我 我正在使用 c 并且对它有点陌生 我正在将一个文本文件加载到我的应用程序中 并将数据拆分为 我正在将字符串的一部分读入
  • Android 设备上短信的默认字符集/编码是什么?

    如果有必要保持简单的话 我主要关心北美的英语手机 具体来说 当发送 接收短信和彩信时 字符是如何编码的 有区别吗 我的初步研究表明UTF 8是默认值 但我也看到了对US ASCII对于美国设备和其他区域设置的其他字符集 Quote 平台默认
  • 如何重新启动 TimerTask

    我编写了一个任务来通过套接字发送特定的 TCP 消息 我有一个包含一堆消息和一些时间戳的文件 因此我将该任务编程为 TimerTask 并使用具有第一个消息时间戳的计时器对其进行调度 当它完成时 任务运行方法结束 但其关联的线程仍然存在 并
  • AFNetworking 2.0下载多张图片完成

    我正在尝试找出一种使用 AFNewtorking 2 0 下载多个图像的方法 我在这里读了很多帖子 但找不到我正在寻找的答案 希望你们能帮助我 问题是我想知道所有下载何时完成以及所有图像是否已下载 所以我有一个带有图像 URL 的数组 蚂蚁
  • SQL 合并时出现 ORA-38104 错误的原因是什么?

    我有这样的代码 MERGE INTO target table tgt USING source table src on tgt c1 src c1 WHEN MATCHED THEN UPDATE SET tgt c1 src c2 I
  • 根据跨越边界的数量,用颜色突出显示超过或低于阈值的 matplotlib 点

    我有一个如下所示的图表 我为获取该图 8 个图的序列之一 而运行的代码如下 date list list df testing set date unique random date list list np random choice d
  • JSON4s 找不到带 Spark 的构造函数

    我在尝试在 Spark 作业中解析 json 时遇到了问题 我使用的是 Spark 1 1 0 json4s 和 Cassandra Spark 连接器以及 DSE 4 6 抛出的异常是 org json4s package Mapping
  • 适当的CSS以确保body元素填满整个屏幕

    我的身体元素有问题 似乎 100 占满了屏幕 但是 如果您将浏览器拖动得较小 然后向下滚动 则主体不会扩展 请参见这个jsFiddle作为一个很好的例子 height 100 是您网站显示的窗口的高度 而不是网站的高度 这会导致向下滚动时背
  • TPL数据流处理N条最新消息

    我正在尝试创建某种队列来处理收到的 N 个最新消息 现在我有这个 private static void SetupMessaging messagingBroadcastBlock new BroadcastBlock
  • 页面加载超时 - 使用 C# 的 Selenium Webdriver

    我正在使用 Selenium 2 25 WebDriver 我在查找页面上的元素时遇到问题 有时我的测试用例能够找到元素 有时页面未加载 这是由于页面加载所致 如果我在下面添加此行 它似乎可以工作 driver Manage Timeout
  • 无法加载库 plpython3.dll

    我在 Postgresql 版本 10 中创建扩展时遇到错误 无法加载库 C Program Files PostgreSQL 10 lib plpython3 dll 找不到指定的模块 CREATE EXTENSION plpython3
  • 我如何/我可以通过 JavaScript 访问 sessionid cookie?

    我已经安装了 jquery 的 cookie 扩展 并且正在尝试访问会话 id cookie 我的会话当前有两个 cookie 请参阅下面的屏幕截图 然而 cookie 只列出了一个 gt cookie Object csrftoken f
  • Rcpp:处理 NumericMatrix 时,* 的语法糖会产生意想不到的结果

    最近被问到的一个问题让我相信语法糖 by Rcpp不按预期工作 在链接的问题中 用户试图将矩阵乘以标量 R code 这就是我们想要实现的目标Rcpp 但现在简单地说R gt m lt matrix 0 3 2 2 gt m 3 1 2 1