如何在Julia中使用map!处理含向量参数的自定义函数?
使用map!调用含向量参数自定义函数的Julia解决方案
问题原因
报错的核心是eachcol()返回的是生成器(Generator),而map!要求后续输入参数必须是AbstractArray类型,不符合方法签名导致MethodError。
解决方案1:转换生成器为数组
将eachcol的结果通过collect()转为数组,匹配map!的参数类型要求,同时保留原函数逻辑:
a1 = ones(100, 2) a2 = ones(100, 2) a3 = ones(100, 2) function expe1(v1, v2, v3) v1 + v2 + v3 end dest = [zeros(100) for i in 1:2] # 转换eachcol生成器为数组,满足map!参数要求 map!(expe1, dest, collect(eachcol(a1)), collect(eachcol(a2)), collect(eachcol(a3)))
解决方案2:原地修改版本(更贴合map!语义)
如果想更高效地原地修改目标数组,可将自定义函数改为接收输出参数的in-place版本:
a1 = ones(100, 2) a2 = ones(100, 2) a3 = ones(100, 2) # 定义in-place版本函数,直接修改out向量 function expe1!(out, v1, v2, v3) out .= v1 .+ v2 .+ v3 return out end dest = [zeros(100) for i in 1:2] # map!调用in-place函数,参数顺序为:函数、目标数组、输出参数占位、输入列数组 map!(expe1!, dest, dest, collect(eachcol(a1)), collect(eachcol(a2)), collect(eachcol(a3)))
说明
collect(eachcol(a))将列生成器转换为Vector{Vector{Float64}},与dest的类型完全匹配,满足map!对输入参数的类型要求。- 方案1中
map!会将expe1的返回值直接赋值给dest的对应元素;方案2则直接在dest的元素上原地修改,避免额外内存分配。
内容的提问来源于stack exchange,提问作者Sungmin Ji
相关产品推荐
相关产品推荐

