You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 15:36:33