相关疑难解决方法(0)

为什么R中的逻辑(布尔值)需要4个字节?

对于逻辑值向量,当一个位向量每个条目消耗1位时,为什么R会分配4个字节?(有关示例,请参阅此问题.)

现在,我意识到R还有助于存储NA值,但是不能用额外的位向量来完成吗?换句话说,为什么仅仅使用廉价的两位数据结构就不够了?

对于它的价值,Matlab使用1个字节作为逻辑,但它不利于NA值.我不确定为什么MathWorks不满足于一位功能,更不用说两位数据结构了,但是他们有花哨的裤子营销人员...... [我会在这个问题上为所有它值得"两点"加牛奶.;-)]


更新1.我认为所提供的架构原因是有道理的,但这感觉有点事后.我没有检查32位或16位R来查看它们的逻辑有多大 - 这可以为这个想法提供一些支持.R Internals手册中可以看出,逻辑向量(LGLSXP)和整数(INTSXP)在每个平台上都是32位.我可以理解整数的通用大小,与字大小无关.类似地,逻辑的存储似乎也与字大小无关.但它太大了.:)

另外,如果字大小参数如此强大,看到Matlab(我认为它是一个32位的Matlab)只消耗1个字节似乎很奇怪 - 我想知道MathWorks是否选择通过权衡编程复杂性来提高内存效率以及查找子词对象的一些其他开销.

此外,肯定还有其他选择:正如Brian Diggs所说,该bit软件包有助于位向量,这对上述问题中的问题非常有用(通过从4字节logical值转换为任务获得8X-10X的加速速度位向量).虽然访问存储器的速度很重要,但从信息理论的角度来看,移动30-31个额外的无信息是浪费的.例如,可以使用类似于此处描述的整数的内存技巧- 获取一堆额外的内存(V单元),然后在位级处理事物(a la bit()).为什么不这样做并NA为长向量保存30位(值为1,为1 )?

如果我的RAM和计算速度受到布尔值的影响,我打算转而使用bit,但这是因为在某些情况下节省97%的空间很重要.:)

我认为这个问题的答案将来自对R的设计或内部有更深入理解的人.最好的例子是Matlab对其逻辑使用不同的大小,在这种情况下,内存字大小不是答案.Python可能与R类似,因为它的价值.

短语的一个相关方法可能是:为什么LGLSXP在所有平台上都会有4个字节?(CHARSXP通常是较小的,也不会那么有用吗?为什么不进行更小的,只是过度分配?)(更新使用的想法CHARSXP可能是假的,因为操作CHARSXP不像整数那样有用如sum,利用相同的数据结构作为字符可能节省空间,但将限制其现有的方法可能在其上进行操作.更合适的考虑因素是使用较小的整数,如下面讨论的).


更新2已经有慕名相对于一个怎样一些很好的和启发性的答案,应该执行布尔速度和编程效率的目标的检索和处理.我认为Tommy的答案特别合理,因为它在R中出现的原因似乎来自于两个前提:

  1. 为了支持对逻辑向量的添加(注意"逻辑"由编程语言/环境定义,并且与布尔值不同),最好通过重用代码来添加整数来实现.在R的情况下,整数消耗4个字节.在Matlab的情况下,最小的整数是1个字节(即int8).这可以解释为什么不同的东西会为逻辑写作带来麻烦.[给那些不熟悉R,它支持上逻辑值的很多数值的操作,例如sum(myVector),mean(myVector)等]

  2. 遗留支持使得除了R和S-Plus已经做了很长时间以外的其他事情变得非常困难.而且,我怀疑在S,S-Plus和R的早期,如果有人做了很多布尔操作,他们在C中做了它们,而不是试图用R中的逻辑做这么多工作.

对于如何实现更好的布尔处理的目的,其他答案是很棒的 - 不要天真地假设一个人可以得到任何单个位:加载一个字最有效,然后屏蔽不感兴趣的位,如德瓦尔描述过.如果为R的布尔操作编写专门的代码(例如我在交叉表中的问题),这是非常非常有用的建议:不要迭代位,而是在单词级别工作.

感谢所有人提供了一套非常全面的答案和见解.

memory boolean r

31
推荐指数
3
解决办法
2471
查看次数

使用R编码序列长度

有没有办法在R中编码增加的整数序列,类似于使用行程编码(rle)编码运行长度?

我将举例说明:

类比:行程编码

r <- c(rep(1, 4), 2, 3, 4, rep(5, 5))
rle(r)
Run Length Encoding
  lengths: int [1:5] 4 1 1 1 5
  values : num [1:5] 1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)

期望:序列长度编码

s <- c(1:4, rep(5, 4), 6:9)
s
[1] 1 2 3 4 5 5 5 5 6 7 8 9

somefunction(s)
Sequence lengths
  lengths: int [1:4] 5 1 1 5
  value1 : num [1:4] 1 5 5 5
Run Code Online (Sandbox Code Playgroud)

编辑1

因此,somefunction(1:10)将给出结果: …

encoding r

14
推荐指数
2
解决办法
2925
查看次数

标签 统计

r ×2

boolean ×1

encoding ×1

memory ×1