提问人:Ned Booker 提问时间:10/22/2021 最后编辑:studentNed Booker 更新时间:10/23/2021 访问量:43
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)
问:
我是 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
我认为这一定是浮点精度误差,但我不确定为什么我的虚拟数据没有重现它,或者哪种方法(或)会更准确!apply
rowsums
答: 暂无答案
评论
a
b
apply
(1/5 + 3/5) - 4/5 == 1/5 + (3/5 - 4/5)
object
runif
set.seed