首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >朱莉娅如何解读10:1?

朱莉娅如何解读10:1?
EN

Stack Overflow用户
提问于 2017-03-23 01:36:14
回答 2查看 733关注 0票数 6

我是长期关注R的外派人员,在这里,: (冒号)运算符从第一个参数到第二个参数创建整数序列:

代码语言:javascript
复制
1:10
# [1]  1  2  3  4  5  6  7  8  9 10
10:1
# [1] 10  9  8  7  6  5  4  3  2  1

注意到这在朱莉娅身上同样有效,我遇到了一个错误:

代码语言:javascript
复制
1:10 .== 10:1

DimensionMismatch(“数组无法广播到公共大小”)

原因:

代码语言:javascript
复制
10:1

输出

代码语言:javascript
复制
10:9

我对这事怎么会发生感到困惑。不用使用10:-1:1似乎很自然--为什么朱莉娅认为10:9是对10:1的正确解释?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-23 02:56:30

朱莉娅不是R,还有其他语言对冒号语法的解释与朱莉娅相似。MATLAB将10:1视为一个空数组,而Python的切片语法(在其他方面不同)也将10:1作为一个空选择来处理索引。Julia选择对空整数范围进行规范化,这样开始和停止之间的区别总是-1,因此它变成了10:9

因此,我不认为对10:1的解释是明确的。然而,在我看来,有一些非常有益的论据支持朱莉娅的解释:

  • 空范围10:9用于表示一些API中索引9和10之间的位置。
  • 范围是朱莉娅和for x in 1:10的核心构造,绝对和明确地必须与等效的C循环一样快。因为语法x:y总是增加一个(而不是负的),所以在编译for循环时,Julia (和LLVM)可以利用这个常量来实现进一步的优化。使这不是常量--或者更糟的是,根据端点的值在UnitRangeStepRange之间动态切换会阻碍这种优化或类型不稳定。
  • 就我个人而言,我觉得R的解释和你对朱莉娅的解释一样令人惊讶,我认为必须明确表示你想要一步-1,这在可读性和防bug方面都是有利的。但我承认,我在以前的语言方面的经验和你的一样有偏见。
票数 14
EN

Stack Overflow用户

发布于 2017-03-23 02:38:34

在Julia中,我们假设a:b构造一个步长为1的范围,所以10:1是一个UnitRange,它应该是一个空范围。由于a:a-1也是一个空范围,因此它相当于a:b中的b<a,请查看源代码这里

代码语言:javascript
复制
julia> dump(10:1)
UnitRange{Int64}
  start: Int64 10
  stop: Int64 9

julia> dump(10:-1:1)
StepRange{Int64,Int64}
  start: Int64 10
  step: Int64 -1
  stop: Int64 1

这里,10:-1:1是一个步长为-1的StepRange,我认为它更精确,更自然地代表了"10到1“的概念。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42965709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档