我是长期关注R的外派人员,在这里,: (冒号)运算符从第一个参数到第二个参数创建整数序列:
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注意到这在朱莉娅身上同样有效,我遇到了一个错误:
1:10 .== 10:1DimensionMismatch(“数组无法广播到公共大小”)
原因:
10:1输出
10:9我对这事怎么会发生感到困惑。不用使用10:-1:1似乎很自然--为什么朱莉娅认为10:9是对10:1的正确解释?
发布于 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)可以利用这个常量来实现进一步的优化。使这不是常量--或者更糟的是,根据端点的值在UnitRange和StepRange之间动态切换会阻碍这种优化或类型不稳定。-1,这在可读性和防bug方面都是有利的。但我承认,我在以前的语言方面的经验和你的一样有偏见。发布于 2017-03-23 02:38:34
在Julia中,我们假设a:b构造一个步长为1的范围,所以10:1是一个UnitRange,它应该是一个空范围。由于a:a-1也是一个空范围,因此它相当于a:b中的b<a,请查看源代码这里。
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“的概念。
https://stackoverflow.com/questions/42965709
复制相似问题