Julia中如何计算多变量最小值以设置绘图Y轴范围?
解决Julia中计算多组数据最值的MethodError问题
错误原因分析
你遇到的MethodError: objects of type Int64 are not callable,是因为误用了minimum函数:
- Julia的
minimum(f, iterable)语法要求第一个参数是函数(用于映射迭代器元素),而你传入的第一个参数m是Int64类型的数值,导致函数调用逻辑错误。
比如这段错误代码:
m = minimum(y1) m = minimum(m, minimum(y2)) # 错误:第一个参数是数值,不是函数
简化示例修复
要计算多组数据的最小值,有两种正确写法:
写法1:用min()比较多个数值
如果已经算出每组的最小值,直接用min()比较这些数值:
y1=[2 3 4] y2=[7 5 6] m = minimum(y1) m = min(m, minimum(y2)) # 正确:用min比较两个最小值
写法2:合并所有数据取最小值
如果不需要单独保存每组的最小值,可以直接合并所有数据后取全局最小:
y1=[2 3 4] y2=[7 5 6] m = minimum(vcat(y1, y2)) # 合并数组后取最小
循环处理CSV的完整修复
针对你遍历CSV文件计算全局最值的场景,需要修正最值更新逻辑,同时优化初始值设置(避免初始值限制范围):
x_data, y_data, names, y_min, y_max = [], [], [], Inf, -Inf # 用无穷大/小作为初始值更合理 # 遍历CSV文件 for filename in readdir(".", join=true) # 只处理csv后缀的文件 endswith(filename, ".csv") || continue df = parse_csv(filename) push!(names, filename) d = df.value push!(y_data, d) # 将当前数据存入y_data # 计算当前数据集的最值并更新全局最值 current_min = minimum(d) current_max = maximum(d) y_min = min(y_min, current_min) y_max = max(y_max, current_max) end # 批量绘图 for (i, d) in enumerate(y_data) lineplot(x_data, d, ylims=(y_min, y_max), name=names[i]) end
关键优化点:
- 初始值设置:用
Inf(正无穷)作为y_min初始值,-Inf(负无穷)作为y_max初始值,确保第一次循环就能被实际数据的最值覆盖,避免初始值(比如100、0)限制最终的范围。 - 最值更新:用
min()和max()分别对比全局最值与当前数据集的最值,逐步更新得到所有数据的全局范围。
内容的提问来源于stack exchange,提问作者Daniel YC Lin
相关产品推荐
相关产品推荐

