R:apply(object, 1, function(x) sum(x-a)/b) 和 rowsums((object-a)/b) 之间的差异

R: difference between apply(object, 1, function(x) sum(x-a)/b) and rowsums((object-a)/b)

提问人:Ned Booker 提问时间:10/22/2021 最后编辑:studentNed Booker 更新时间:10/23/2021 访问量:43

问:

我是 R 的新手,正在为 apply 函数而苦苦挣扎。执行起来真的很慢,我正在尝试优化我收到的一些代码。

我正在尝试进行一些矩阵运算(对 ~10^6 个元素矩阵进行逐元素乘法和除法),然后对结果矩阵的行求和。我找到了这个很棒的库,它在大约 1/30 的时间内执行了我认为相同的代码,但我的“优化”答案和之前的答案之间存在系统差异。Rfast

原始代码大致如下

ans <- apply(object, 1, function(x) sum((x - a) / b))

我的代码是

ans = Rfast:::rowsums((object-a)/b)

我不确定是因为其中一种方法是放弃精度还是四舍五入错误 - 有什么想法吗?

编辑

尝试重现错误非常困难......

我已经能够将差异隔离到我除以我的向量时,每个条目 ~ 3000(即 .如果我去掉这个术语,这两种方法给出相同的答案。b[3016.460436, 3021.210321, 3033.3303219]

然后我尝试了两种方法来改进我的答案,一种是除以 1000,然后在最后将总和除以 1000。这不起作用,大概是因为无论哪种方式,浮点精度都是相同的。b

我还尝试强制我的向量为整数,但也没有用。b

示例数据也没有重现我的错误,这令人沮丧......

objmat = rbind(rep(c(1,0,0),1000),rep(c(0,0,1),1000))
amat = rbind(rep(c(0.064384654, 0.025465132, 0.36543214),1000))
bmat = rbind(rep(c(1016.460431,1021.210431,1033.330431),1000))
ans = apply(objmat,1,function(x) sum((x-amat)/bmat))

答[1] = 0.5418828413

行总和((objmat[1,]-amat)/bmat) = 0.5418828413

我认为这一定是浮点精度误差,但我不确定为什么我的虚拟数据没有重现它,或者哪种方法(或)会更准确!applyrowsums

r 浮动精度

评论

0赞 akrun 10/22/2021
什么是和 .它可能取决于 'a' 和 'b' 的长度,在 u 遍历行中,我假设 a 和 b 长度将是对象列数的长度。abapply
1赞 Rui Barradas 10/22/2021
也许没有一种方法会降低精度或出现舍入错误:.这可能是 R FAQ 7.31 或为什么这些数字不相等?(1/5 + 3/5) - 4/5 == 1/5 + (3/5 - 4/5)
0赞 r2evans 10/22/2021
你能提供一个可重复的例子吗?我们不需要你的(大),一个小的就可以了。我推断差异是亚十进制的,在这种情况下,人们可能会使用另一个随机函数来生成它;如果是这样,请记得使用,以便我们可以看到相同的数字/结果。谢谢。objectrunifset.seed
0赞 Eric Postpischil 10/23/2021
这篇文章包含的信息不足以诊断该问题,只能推测这是由于浮点运算中发生的正常舍入造成的。它甚至没有显示两个不同答案的示例,更不用说产生它们的输入和实际代码了。
0赞 Ned Booker 10/26/2021
我明白了!我正在处理一些加载的数据,但是当我尝试使用虚拟数据来重现该错误时,我无法做到,因此我所希望的只是猜测!

答: 暂无答案