如何检查变量在julia中是否为标量

如何检查变量在julia中是否为标量,julia,Julia,我想检查变量在julia中是否是标量,例如整数、字符串、数字,但不是AstractArray、元组、类型、结构等。是否有一种简单的方法可以做到这一点(即,isscalar(x))什么是标量、什么不是标量的概念没有更多的上下文定义。 数学上定义了标量;() 标量是字段的元素,用于定义向量空间 也就是说,您需要基于字段定义一个向量空间,然后才能确定某个对象是标量还是非标量(相对于该向量空间)。 对于右向量空间,元组可以是标量 当然,我们不是在寻找一个数学上严格的定义。 只是务实的一个 以广播认为的标

我想检查变量在julia中是否是标量,例如整数、字符串、数字,但不是AstractArray、元组、类型、结构等。是否有一种简单的方法可以做到这一点(即,
isscalar(x)

什么是标量、什么不是标量的概念没有更多的上下文定义。 数学上定义了标量;()

标量是字段的元素,用于定义向量空间

也就是说,您需要基于字段定义一个向量空间,然后才能确定某个对象是标量还是非标量(相对于该向量空间)。 对于右向量空间,元组可以是标量

当然,我们不是在寻找一个数学上严格的定义。 只是务实的一个

以广播认为的标量为基础 我认为在julia中定义标量的唯一有意义的方法是广播行为。 自1日起:

using Base.Broadcast

isscalar(x::T) where T = isscalar(T)
isscalar(::Type{T}) where T = BroadcastStyle(T) isa Broadcast.DefaultArrayStyle{0}
有关详细信息,请参阅文档

在julia 0.7中,
Scalar
是默认值。所以它基本上是没有特定广播行为的任何东西,也就是说,它会删除数组和元组等内容: 使用Base.Broadcast

isscalar(x::T) where T = isscalar(T)
isscalar(::Type{T}) where T = BroadcastStyle(T) isa Broadcast.Scalar
在julia 0.6中,这有点混乱,但类似:

isscalar(x::T) where T = isscalar(T)
isscalar(::Type{T}) where T = Base.Broadcast._containertype(T)===Any
与使用您自己的方法相比,使用
Broadcast
方法来确定某个对象是否为标量对象的优势在于,任何创建将以标量方式运行的新类型的人都必须确保它与这些方法正确配合 (或者实际上是非标量,因为标量是默认值。)


结构不是标量 也就是说:有时结构是标量的,有时不是标量的,这取决于结构

但是,这些方法并不认为<代码>结构> <代码>是非标量的。 我认为你想去的愿望是错误的

Julia结构不是(必然或通常)集合类型。 请考虑:<代码> BigInteger <代码> >代码> BigFuff >代码> 都是使用结构定义的

我很想说,使用
start
方法会使类型变为非标度,但这是不正确的,因为定义了
start(::Number)

(这一直是)

我发现自己最近需要捕捉某个事物是否是标量的概念

我从网上找到了基于董事会投票的规则, 不符合我的需要

特别是,我想把字符串看作非标量。< /P> 我定义了一个特征, 基于

方法存在(开始,(T,)
, 除上述一些例外情况外,例如对于
编号

abstract type Scalarness end
struct Scalar <: Scalarness end
struct NotScalar <: Scalarness end

isscalar(::Type{Any}) = NotScalar() # if we don't know the type we can't really know if scalar or not
isscalar(::Type{<:AbstractString}) = NotScalar() # We consider strings to be nonscalar
isscalar(::Type{<:Number}) = Scalar() # We consider Numbers to be scalar
isscalar(::Type{Char}) = Scalar() # We consider Sharacter to be scalar
isscalar(::Type{T}) where T = method_exists(start, (T,)) ? NotScalar() : Scalar()

关于
isa(x,Number)| isa(x,String)
(大概您也可以将
Char
添加到该列表中)如何谢谢,所以列出所有标量类型可能是最简单的解决方案。我将浏览julia类型页面。我不确定是否遗漏了任何标量,但这里是:
isscalar(x)=isa(x,Union{Number,AbstractString,Char,Bool})
。然而,这将忽略可为空的值!我想你是否想考虑<代码> null >代码>一个标量或不在讨论中(例如,注意“空数组”与“空数组”不一样)…但是如果你真的想考虑它,我想在你的定义中添加一个<代码> {空(x)< /代码>是可能的。联盟的选择很有趣;我不知道这是否更有效(我假设不是,但我可能错了)。你是对的,结构或复合对象应该是标量,以与现有的“结构”数字保持一致。非常感谢您使用Broadcast.scalar定义标量。我希望广播可以应用于子阵列(即广播到阵列的片)。但这似乎打破了广播的概念。我们可以单独问这个问题。我很想看看答案。指向广播的链接。Scalar没有显示标量的任何定义。这是指向
广播的链接。下一句话是以ScalarAlso这个词开头的,我认为它可能在julia0.7-prerelease之后发生了一些变化。因此,术语可能会有所不同。我会调查并更新答案。
isscalar(x) == applicable(start, x) && !isa(x, Integer) && !isa(x, Char) && !isa(x, Task)