如何检查变量是否是julia中的标量

Phu*_*uoc 3 julia

我想检查变量是否是julia中的标量,例如Integer,String,Number,但不是AstractArray,Tuple,type,struct等.是否有一个简单的方法来执行此操作(即isscalar(x))

Lyn*_*ite 7

什么是或不是标量的概念在没有更多背景的情况下是不明确的.在数学上,定义了标量; (维基百科)

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

也就是说,在确定某些东西是否是标量(相对于该向量空间)之前,需要根据字段定义向量空间.对于正确的向量空间,元组可以是标量.

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

基于广播认为是标量的基础

我建议在julia中定义标量的唯一有意义的方式是广播的行为.在Julia 0.7-dev中#23939, 我相信这应该是这样简单:

using Base.Broadcast

isscalar(x::T) where T = isscalar(T)
isscalar(::Type{T}) where T = BroadcastStyle(T) isa Broadcast.DefaultArrayStyle{0}
Run Code Online (Sandbox Code Playgroud)

请参阅广播文档. Scalar是默认值.因此它基本上是没有特定广播行为的任何东西,即它会敲出像数组和元组等的东西.

在朱莉娅0.6这有点混乱,但类似:

isscalar(x::T) where T = isscalar(T)
isscalar(::Type{T}) where T = BroadcastStyle(T) isa Broadcast.Scalar
Run Code Online (Sandbox Code Playgroud)

使用这些方法Broadcast确定某些东西是标量的优势,而不是使用自己的方法,是任何一个以标量方式运行的新类型必须确保它能正确地使用这些方法(或者实际上是非标量的标量是默认值.)


结构不是标量

也就是说:有时结构是标量,有时它们不是,它取决于结构.

但请注意,这些方法考虑struct是非标量的.我想你错了你的愿望.

Julia结构不是(必然或通常)集合类型.考虑到:BigInteger,BigFloat,Complex128等等等等使用结构都被定义

我很想说有一个start方法会使一个类型成为非标量类型,但是这个start(::Number)定义是不正确的.(这已经辩论了几次)