【问题标题】:Unable to convert SharedArray to Array automatically in Julia?无法在 Julia 中自动将 SharedArray 转换为 Array?
【发布时间】:2016-07-13 18:24:02
【问题描述】:

所以我在 Julia 中使用了一个抱怨的库,因为它无法将 SharedArray 转换为普通数组。我什至尝试在 Base.convert() 中显式提供一个转换函数,以查看是否可以解决它,但它失败了。我很困惑为什么我的转换不起作用。

这里是转换函数:

convert(::Type{Array{Int64,1}}, x::SharedArray{Int64, 1}) = x.s


ERROR: TypeError: ensure_loaded: in typeassert, expected Array{Int64,1}, got SharedArray{Int64,1}
 in rmse at .../.julia/v0.4/RecSys/src/als-wr.jl:105

我已经用库填写了ticket,但确实应该有一种方法来提交转换以解决这些问题,我对它为什么不起作用有点困惑。任何帮助将不胜感激。

更新:这是该问题的最低工作示例。愿它成为一个关于转换和提升之间区别的优秀教学工具:

function foo(input :: Vector{64})
  nothing
end

#IN some other file...
function shoo(some_array :: SharedArray{Int64, 1}) #Still an error even with the conversion
  a = some_array :: Vector
  foo(a)
end

import Base.convert
convert(::Type{Vector}, x::SharedArray{Int64, 1}) = x.s

some_array =  S = SharedArray(Int, 64, init = S -> S[Base.localindexes(S)] = myid())
shoo(some_array)

【问题讨论】:

  • 等等,为什么在这种情况下必须添加到Base.convert()?你已经可以做A = SharedArray(Int64, 5); B = convert(Array{Int64}, A);
  • 因为它会给出错误,并且添加 Base.convert() 可确保 Julia 可以自动将其转换为正确的类型而不会发出任何警告。转换函数可以自动应用,我很困惑为什么在这种情况下不能自动应用。
  • MWE 在这里会很棒。
  • 这对 MWE 来说真的很棒。这将是一个很好的参考问题。

标签: types casting type-conversion julia


【解决方案1】:

Julia 没有自动转换功能。

Docs:

... Julia 属于“无自动提升”类别:...函数的参数永远不会自动转换。

有时看起来好像正在完成自动转换, 但他们不是。只是定义了一个方法来进行转换。 通常作为::Any 类型参数的后备(这就是算术运算符的工作原理)。


例如:

有一个定义的方法:Base.convert(::Type{Float64}, Int64)

Base.convert(Float64, 6)
> 6.0

这行得通。

类型断言是断言事物具有特定类型。 写val::Type。 它们可用于鼓励类型稳定性,并帮助进行推理。 并强制(作为断言)事情如你所愿。

现在让我们用 type-asserts 做一些作业。

a = 6 ::Float64
>ERROR: TypeError: typeassert: expected Float64, got Int64

a = 6.0 ::Float64
>6.0

a = convert(Float64,6) ::Float64
>6.0

所以仅仅定义类型之间的转换是不够的。 需要在类型断言之前将调用 convert 添加到代码中,以完成转换。

【讨论】:

  • 感谢您的详尽解释;我现在正在与库维护人员一起解决这个问题,但非常感谢你帮助我了解 Julia 的功能。
【解决方案2】:

尝试使用 Array() 函数。这对我有用。

【讨论】:

  • 我的问题不是如何将它转换为数组,我的问题是为什么转换函数没有自动转换它并且仍然产生类型断言错误。
猜你喜欢
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
相关资源
最近更新 更多