knnsearch 从 Matlab 到 Julia
knnsearch from Matlab to Julia
我正在尝试使用 NearestNeighbors.jl 包在 Julia 中进行 运行 最近邻搜索。对应的Matlab代码为
X = rand(10);
Y = rand(100);
Z = zeros(size(Y));
Z = knnsearch(X, Y);
这将生成长度为 100 的向量 Z,其中第 i 个元素是 X 的索引,其元素最接近 Y 中的第 i 个元素,对于所有 i=1:100。
真的需要一些帮助将上面的 Matlab 代码的最后一行转换为 Julia!
使用:
X = rand(1, 10)
Y = rand(1, 100)
nn(KDTree(X), Y)[1]
存储中间 KDTree
对象如果您想在将来重用它会很有用(因为它会提高查询效率)。
现在我的例子的关键点是什么。 NearestNeighbors.jl 接受以下输入数据:
It can either be:
- a matrix of size nd × np with the points to insert in the tree where nd is the dimensionality of the points and np is the number of points
- a vector of vectors with fixed dimensionality, nd, which must be part of the type.
我用的是第一种方法。关键是观察必须在列中(而不是在原始代码中的行中)。请记住,在 Julia 中,向量是柱状的,因此 rand(10)
被 NearestNeighbors.jl 视为具有 10 个维度的 1 个观察值,而 rand(1, 10)
被视为具有 1 个维度的 10 个观察值。
但是,对于您的原始数据,因为您只需要最近的邻居,并且它是 single-dimensional 并且很小,所以足以写入(这里我假设 X
和 Y
是您存储在向量中的原始数据):
[argmin(abs(v - y) for v in X) for y in Y]
不使用任何额外的包。
NearestNeighbors.jl 对于处理包含很多元素的 high-dimensional 数据非常有效。
我正在尝试使用 NearestNeighbors.jl 包在 Julia 中进行 运行 最近邻搜索。对应的Matlab代码为
X = rand(10);
Y = rand(100);
Z = zeros(size(Y));
Z = knnsearch(X, Y);
这将生成长度为 100 的向量 Z,其中第 i 个元素是 X 的索引,其元素最接近 Y 中的第 i 个元素,对于所有 i=1:100。
真的需要一些帮助将上面的 Matlab 代码的最后一行转换为 Julia!
使用:
X = rand(1, 10)
Y = rand(1, 100)
nn(KDTree(X), Y)[1]
存储中间 KDTree
对象如果您想在将来重用它会很有用(因为它会提高查询效率)。
现在我的例子的关键点是什么。 NearestNeighbors.jl 接受以下输入数据:
It can either be:
- a matrix of size nd × np with the points to insert in the tree where nd is the dimensionality of the points and np is the number of points
- a vector of vectors with fixed dimensionality, nd, which must be part of the type.
我用的是第一种方法。关键是观察必须在列中(而不是在原始代码中的行中)。请记住,在 Julia 中,向量是柱状的,因此 rand(10)
被 NearestNeighbors.jl 视为具有 10 个维度的 1 个观察值,而 rand(1, 10)
被视为具有 1 个维度的 10 个观察值。
但是,对于您的原始数据,因为您只需要最近的邻居,并且它是 single-dimensional 并且很小,所以足以写入(这里我假设 X
和 Y
是您存储在向量中的原始数据):
[argmin(abs(v - y) for v in X) for y in Y]
不使用任何额外的包。
NearestNeighbors.jl 对于处理包含很多元素的 high-dimensional 数据非常有效。