在Julia中构建距离矩阵:修复UndefVarError代码报错
修复距离矩阵计算代码中的UndefVarError错误
给定一个20×122的矩阵p,其每一行是一个20维向量,想要计算每个向量之间的距离并构建距离矩阵,但运行以下代码时出现错误:
mul = [] for i in 1:size(p,1) push!(mul,norm(p[1,:]-p[i,:])) end mul = transpose(tiedrank(mul)) for i in 2:size(p,1) for j in 1:size(p,1) mul2 = [] push!(mul2,norm(p[i,:]-p[j,:])) end mul = vcat(mul,tiedrank(mul2)') end mul
错误信息:
UndefVarError: mul2 not defined
错误原因
mul2被定义在内层for j循环的内部,每次迭代j时都会重新将mul2初始化为空数组:
- 若矩阵没有行(
size(p,1)=0),j循环不会执行,mul2从未被定义,直接触发UndefVarError; - 即使矩阵有行,当前逻辑下
mul2每次都会被重置,最终仅保留最后一个j对应的距离值,无法收集第i行与所有行的距离,逻辑完全错误。
修复后的代码
优化版(更高效易读)
# 获取矩阵行数 n = size(p, 1) # 初始化距离矩阵 dist_matrix = zeros(n, n) # 计算所有两两向量的欧氏距离 for i in 1:n for j in 1:n dist_matrix[i, j] = norm(p[i, :] - p[j, :]) end end # 对每行距离计算秩(处理并列情况) rank_matrix = mapslices(tiedrank, dist_matrix; dims=2)
保留原逻辑的修复版
如果希望保留原代码的分步构建方式,只需将mul2的初始化移到j循环外部:
mul = [] # 处理第一行 for i in 1:size(p,1) push!(mul, norm(p[1,:] - p[i,:])) end mul = transpose(tiedrank(mul)) # 处理第2到第n行 for i in 2:size(p,1) mul2 = [] # 移到j循环外,确保收集所有距离 for j in 1:size(p,1) push!(mul2, norm(p[i,:] - p[j,:])) end mul = vcat(mul, transpose(tiedrank(mul2))) end mul
核心修复点
- 将
mul2 = []从内层j循环移至外层i循环内部、j循环外部,保证每次处理第i行时,mul2能完整收集该行与所有行的距离; - 彻底避免
mul2未定义的情况,同时保证距离值的正确收集。
内容的提问来源于stack exchange,提问作者Josie G
相关产品推荐
相关产品推荐

