Julia中如何使用map将多参数函数应用到向量上?
多参数函数结合map传入固定参数的实现方法
map的核心运行规则是:传入函数后,后续提供的所有可迭代对象必须长度一致,函数会按位置依次取出每个可迭代对象的元素作为入参执行。要给多参数函数传入固定值、仅对目标向量做遍历,有以下几种可直接运行的正确写法:
- 写法1:匿名函数封装(最直观易读,无额外依赖)
f = function(a,b) a*b end x = [1,2,3,4,5] fixed_val = 3 # 固定第二个参数为fixed_val,仅遍历x的元素 map(a -> f(a, fixed_val), x)
运行输出为[3, 6, 9, 12, 15],完全符合预期。
- 写法2:偏函数构造(无额外性能开销,适合固定参数位置明确的场景)
Julia内置了偏函数构造器Fix1/Fix2,可以直接固定函数的第1/第2个参数,不需要手写匿名函数:
# 固定f的第二个参数为3,遍历x map(Base.Fix2(f, fixed_val), x)
如果需要固定第一个参数,替换为Base.Fix1(f, fixed_val)即可。
- 写法3:广播语法(Julia原生逐元素运算写法,最简洁)
如果不需要严格用map,Julia自带的广播语法会自动识别标量固定值,不需要做额外封装,写起来最简便:
# 函数名后加.即为广播调用,自动对标量做逐元素匹配 f.(x, fixed_val)
此前尝试的写法错误原因
map(f(a,b), x, 3):f(a,b)是直接执行函数得到运算结果,不是把函数对象传给map,相当于把一个数值作为第一个入参传入,会触发类型错误map(f, x, 3):map要求后续传入的所有可迭代对象长度匹配,x长度为5,标量3不是长度为5的可迭代对象,会触发长度不匹配错误map(f, a=x, b=3):map不支持关键字传参的形式,后续参数必须是按位置传入的可迭代对象- 把固定值用
fill(3, length(x))包裹成等长数组再传入map(f, x, fill(3, length(x)))虽然也能跑,但会额外生成同长度的数组产生内存开销,不推荐使用。
内容的提问来源于stack exchange,提问作者Suvar
相关产品推荐
相关产品推荐

