You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Julia中如何预定义适配特定元组数组类型的容器?

合适的预分配方案:字典优先,数组备选

首先得澄清一点:你的classes是字符串键的字典,如果想保留arr[class]这种通过字符串键直接访问的写法,用字典来预分配arr才是最贴合场景的选择——数组是靠整数索引访问的,没法直接用"Item1"这种字符串当索引。下面给你两种可行的方案:

1. 推荐:预分配同键字典

先给pmap返回的元素类型起个别名,让代码更简洁(也可以直接写完整类型):

# 定义返回的元组类型别名,避免重复写长类型声明
const ResultTuple = Tuple{Float64, Float64, Float64, Vector{Float64}}

接下来有两种预分配字典的方式:

  • 方式一:先创建空字典,循环时直接赋值
arr = Dict{String, Vector{ResultTuple}}()
  • 方式二:预先为每个classes的键初始化空数组(如果需要提前占位)
arr = Dict(class => ResultTuple[] for class in keys(classes))

之后你的循环逻辑可以直接沿用:

for class in keys(classes)
    arr[class] = pmap(y -> func(arg, y), 1:length(arg1), batch_size=Int(round(length(arg)/nworkers())))
end

2. 备选:用数组预分配(需依赖有序键)

如果你确实需要用数组存储,那得先把classes的键转为有序列表,再通过整数索引访问:

const ResultTuple = Tuple{Float64, Float64, Float64, Vector{Float64}}
# 先获取排序后的键列表,保证访问顺序固定
sorted_class_keys = sort(collect(keys(classes)))
# 预分配数组,长度和classes一致,每个元素是ResultTuple的数组
arr = Vector{Vector{ResultTuple}}(undef, length(sorted_class_keys))

# 循环时用枚举绑定索引和键
for (idx, class) in enumerate(sorted_class_keys)
    arr[idx] = pmap(y -> func(arg, y), 1:length(arg1), batch_size=Int(round(length(arg)/nworkers())))
end

为什么你之前的数组定义行不通?

你想定义的Array{Array{Tuple{...},1},1}是一个数组的数组,它只能通过整数索引(比如arr[1])访问元素,没办法用"Item1"这种字符串键。而你的循环逻辑里是用class(字符串)作为索引,这就和数组的访问方式不匹配了——这也是为什么推荐用字典的核心原因。

内容的提问来源于stack exchange,提问作者Sameeresque

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:48:59