Julia中如何基于数组行元素求函数的argmin(行索引)
解决Julia中基于自定义双参数函数的数组行argmin问题
错误原因
你调用argmin(f,A)时触发MethodError,是因为argmin会尝试将数组A的单个数值元素传入函数f,但f定义为需要两个独立参数x和y,参数数量不匹配导致报错。
优雅高效的实现方法
无需手动写for循环,可通过argmin结合匿名函数/do块,直接遍历行索引或行向量计算函数值,最终得到使f取值最小的行索引:
方法1:遍历行索引,直接解构每行元素
f(x,y) = 2x^2 - y^2 A = [1 2; 3 4] # 针对每个行索引计算对应行的f值,argmin返回最小的索引 min_row_idx = argmin(1:size(A,1)) do i x, y = A[i, :] f(x, y) end
方法2:遍历行向量,用解构赋值简化参数传递
如果更习惯直接处理行向量,可通过eachrow生成行迭代器,再解构每行的两个元素:
f(x,y) = 2x^2 - y^2 A = [1 2; 3 4] # 先获取f值最小的行向量,再匹配得到对应索引 min_row = argmin(eachrow(A)) do (x,y) f(x,y) end min_row_idx = findfirst(==(min_row), eachrow(A))
方法3:修改函数为接受向量参数(若允许)
如果可以调整原函数的参数形式,让它接受行向量,代码会更简洁:
f(v) = 2v[1]^2 - v[2]^2 A = [1 2; 3 4] min_row_idx = argmin(1:size(A,1)) do i f(A[i, :]) end
以上方法均利用Julia的迭代器和argmin的高阶函数特性实现高效计算,最终得到的min_row_idx为1(对应第一行,其f值为-2,是两行中的最小值)。
内容的提问来源于stack exchange,提问作者Pengo
相关产品推荐
相关产品推荐

