为什么 SharedArray 的 SetIndex 抱怨不可变类型?

Why are is SetIndex of a SharedArray complaining with Immutable types?

所以我有一个非常简单的问题。我有一个定义如下的类型:

# An internal type used only by the train function for caching between epochs.
immutable Residual
    value::Float32
    curr_error::Float32
    prev_error::Float32
end

我正在 Julia 中研究机器学习算法,并希望通过在 @parrellel 循环结束时检查这些值来中断。为此,我使用了这样定义的 SharedArrays。

residuals = SharedArray(Residual, size(rating_set.training_set), init = S -> S[Base.localindexes(S)] = [Residual(rating.value, 0.0, 0.0) for rating in rating_set.training_set[Base.localindexes(S)]])

现在,在循环内,我想用一个简单的更新步骤来更新残差。由于它是不可变的,我假设我必须创建一个新的 Residual 对象并将其填充到 SharedArray 中。

residual[j] = Residual(residual.value, -user_feature * item_feature + residual.value, residual.curr_error)

但是,每当我 运行 代码时,我都会收到以下错误。

LoadError: MethodError: `setindex!` has no method matching setindex!(::Residual, ::Residual, ::Int64)

我不确定我做错了什么,我认为这与打字有关?还是我完全误解了 Julia 中的 SharedArrays?任何帮助将不胜感激。

好吧,这很尴尬,我在数组中遗漏了一个 s 所以它试图在不可变类型上设置索引...我会把这个问题留在这里以防其他人犯同样的错误.