首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用nanoflann的奇异行为

使用nanoflann的奇异行为
EN

Stack Overflow用户
提问于 2020-12-01 22:49:35
回答 1查看 62关注 0票数 1

在使用nanoflann-library进行基于KDTrees的k近邻搜索时,我遇到了一个非常奇怪的行为。我的代码是一组简单的查询:

代码语言:javascript
运行
AI代码解释
复制
#include <vector>
#include <iostream>
#include <nanoflann.hpp>
#include <eigen3/Eigen/Dense>

using Eigen::MatrixX3d;
using Eigen::Vector3d;

using nanoflann::KNNResultSet;
using nanoflann::SearchParams;
using kdt = nanoflann::KDTreeEigenMatrixAdaptor<MatrixX3d, 3, nanoflann::metric_L2>;

int main()
{
    // Create simple matrix
    MatrixX3d matrix(10, 3);
    for(unsigned int i = 0; i < 10; i++)
    {
        double f_i = static_cast<double>(i);
        matrix.row(i) = Vector3d(f_i, 0, 0);
    }

    // Create test points
    std::vector<Vector3d> test_vecs;
    for(unsigned int i = 0; i < 10; i++)
    {
        double f_i = static_cast<double>(i);
        test_vecs.push_back(Vector3d(f_i, f_i, f_i));
    }
    
    // Result buffer
    double distance;
    size_t index;
    KNNResultSet<double> result_set(1);
    result_set.init(&index, &distance);
    SearchParams sp;
    // KDTree
    kdt matrix_index(3, std::ref(matrix), 10);
    matrix_index.index->buildIndex();

    //Query points backwards
    for(int i = 9; i >= 0; i--)
    {
        Vector3d curr_vec = test_vecs.at(i);
        matrix_index.index->findNeighbors(result_set, &curr_vec[0], sp);
        std::cout << i << std::endl;
        std::cout << index << " " << distance << std::endl << std::endl;
    }

    // Query points forwards
    for(unsigned int i = 0; i < 10; i++)
    {
        Vector3d curr_vec = test_vecs.at(i);
        matrix_index.index->findNeighbors(result_set, &curr_vec[0], sp);
        std::cout << i << std::endl;
        std::cout << index << " " << distance << std::endl << std::endl;
    }
}

向后查询(BQ)返回预期的结果。然而,正向查询(FQ)只产生零(索引和距离)。FQ似乎也完全打破了KDTree。如果更改两个查询(最后两个for循环)的顺序,以便在BQ之前执行FQ,那么这两个查询现在都将只生成0。

为什么会发生这种行为,以及如何规避它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-02 05:28:38

结果集看起来是有状态的-它总是向您显示所有点中最接近的整体邻居。例如,如果您从5循环到10,那么每次迭代都会得到5 50

在每次迭代中重新初始化结果集,您将获得所需的行为:

代码语言:javascript
运行
AI代码解释
复制
result_set.init(&index, &distance);
matrix_index.index->findNeighbors(result_set, &curr_vec[0], sp);

演示:https://godbolt.org/z/s5f1jq

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65099735

复制
相关文章
nanoflann库
点云处理过程中可能会遇到寻找最临近点的问题,常用的解决方案就是用空间换效率。例如建立kd-tree等树状结构来代替遍历。
点云PCL博主
2019/07/30
4.1K0
nanoflann库
矩阵奇异分解奇异值分解定理
定理 设 非奇异,则存在正交矩阵P和Q,使得 其中 证明 因为A非奇异,所以 为实对称正定矩阵,于是存在正交矩阵Q使得, 为 的特征值 设x为非0特征向量,因为
用户1733462
2018/06/01
1.7K0
奇异的22∶78法则
为了增加matlab爱好者微信公众号内容的充实性,提供多元化多维度多视角阅读素材,让matlab爱好者的关注者受益更多。今后matlab爱好者推文包括但不限于matlab编程和科研相关内容,会增加一些涵盖生活、文化、经济和科技等方面的知识。欲获取更多丰富多彩的,请持续关注matlab爱好者!!!
巴山学长
2019/07/15
1K0
奇异的22∶78法则
AI数学基础之:奇异值和奇异值分解
奇异值是矩阵中的一个非常重要的概念,一般是通过奇异值分解的方法来得到的,奇异值分解是线性代数和矩阵论中一种重要的矩阵分解法,在统计学和信号处理中非常的重要。
用户2323866
2021/06/21
6300
AI数学基础之:奇异值和奇异值分解
奇异值是矩阵中的一个非常重要的概念,一般是通过奇异值分解的方法来得到的,奇异值分解是线性代数和矩阵论中一种重要的矩阵分解法,在统计学和信号处理中非常的重要。
程序那些事
2021/03/16
8090
矩阵的奇异值分解
奇异值分解(singular value decomposition, SVD),是将矩阵分解成奇异值(singular vector)和奇异值(singular value)。通过奇异值分解,我们会得到一些与特征分解相同类型的信息。然而,奇异值分解有更广泛的应用,每个实数矩阵都有一个奇异值,但不一定都有特征分解。例如,非方阵的矩阵没有特征分解,这时我们只能使用奇异值分解。
狼啸风云
2019/09/18
1.2K0
矩阵的奇异值分解
如何使用“行为模型”做用户行为养成
用户可能会习惯性的使用一款产品,或者在使用一款产品时会产生习惯性的行为。造成这种情况的原因可以有很多,比如不断的刷朋友圈生怕错过什么信息、比如刷抖音熬夜停不下来、比如每天都要开黑一局…
晓吾
2022/01/21
1.8K0
如何使用“行为模型”做用户行为养成
矩阵的奇异值分解
设A\in C^{m\times n},则矩阵A^{H}A的n个特征值\lambda _i的算术平方根\delta _{i}=\sqrt {\lambda _i}叫做A的奇异值(Singular Value )。
卡尔曼和玻尔兹曼谁曼
2019/01/22
1.1K0
如何让奇异值分解(SVD)变得不“奇异”?
在之前的一篇文章:划重点!通俗解释协方差与相关系数,红色石头为大家通俗化地讲解了协方差是如何定义的,以及如何直观理解协方差,并且比较了协方差与相关系数的关系。
红色石头
2022/01/12
6270
如何让奇异值分解(SVD)变得不“奇异”?
奇异值分解
最近两天都在看奇异值分解及其在推荐系统和图像压缩方面的应用,这部分知识比较散也比较难理解,看代码不是很好懂,所以通过编学边整理的方式帮助大脑理解这部分知识。 奇异值分解是什么 奇异值分解(Sin
刘开心_1266679
2018/04/17
8120
奇异值分解
使用JavaScript控制行为
JavaScript基本语法 语句和注释 变量和数据类型 声明和赋值 简单数据类型和复杂数据类型 变量的命名规则 表达式和运算符 赋值运算符 算术运算符 比较运算符 逻辑运算符 分支结构 if…else... switch…case…default... 循环结构 for循环 while循环 do…while循环 数组 创建数组 操作数组中的元素 函数 声明函数 调用函数 参数和返回值 匿名函数 立即调用函数
用户8442333
2021/05/20
3600
AI数学基础之:奇异值和奇异值分解
奇异值是矩阵中的一个非常重要的概念,一般是通过奇异值分解的方法来得到的,奇异值分解是线性代数和矩阵论中一种重要的矩阵分解法,在统计学和信号处理中非常的重要。
程序那些事
2021/02/23
7040
奇异值分解(SVD)
奇异值分解(Singular Value Decomposition,简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。
AngelNH
2020/07/15
9390
奇异值分解(SVD)
奇异值分解SVD
矩阵分解在机器学习领域有着广泛应用,是降维相关算法的基本组成部分。常见的矩阵分解方式有以下两种
生信修炼手册
2021/04/14
9310
奇异值分解 SVD 的数学解释
本文介绍了奇异值分解(SVD)在机器学习和深度学习领域中的应用,包括图像压缩、去噪、降维等方面。SVD是一种矩阵分解方法,能够将矩阵分解为三个矩阵的乘积,从而可以用于计算图像压缩、去噪、降维等任务中的奇异值。同时,SVD也可以用于深度学习中的特征值分解,从而帮助机器学习算法更好地理解数据。
Alan Lee
2018/01/02
1.5K0
奇异值分解 SVD 的数学解释
奇异值分解 SVD
奇异值分解(Singular Value Decomposition,SVD)可以用于降维算法中特征分解,还可以用于推荐系统以及自然语言处理等领域。
yangzelong
2019/03/26
5990
奇异值分解 SVD
奇异值分解(SVD)
最近两天都在看奇异值分解及其在推荐系统和图像压缩方面的应用,这部分知识比较散也比较难理解,看代码不是很好懂,所以通过编学边整理的方式帮助大脑理解这部分知识。 SVD思维导图 奇异值分解是什么 奇异值
用户1332428
2018/03/08
1.6K0
奇异值分解(SVD)
使用setvbuf更改printf的默认buffer 行为
有3种buffer行为,“不缓冲”,“基于块的缓冲”和“基于行的缓冲”。stdout(printf)默认是基于行的缓冲,即写到stdout的字符都会被缓冲起来直到一个换行符输出的时候,这些字符才会被打印出来;标准错误输出stderr默认是不缓冲的,即写到stderr的字符会马上被打印出来。
用户7886150
2021/02/14
1.6K0
SVD奇异值分解 中特征值与奇异值的数学理解与意义
更像是矩阵分解多一点,没有涉及到SVD的数学意义,这篇博客大概会写一些数学SVD的数学理解,以及SVD在PCA和推荐算法上面的应用。
大鹅
2021/06/16
2.3K0
Using truncated SVD to reduce dimensionality使用截断奇异值进行降维
Truncated Singular Value Decomposition (SVD) is a matrix factorization technique that factors a matrix M into the three matrices U, Σ, and V. This is very similar to PCA, excepting that the factorization for SVD is done on the data matrix, whereas for PCA, the factorization is done on the covariance matrix. Typically, SVD is used under the hood to find the principle components of a matrix.
到不了的都叫做远方
2019/11/03
2.4K0

相似问题

奇异SFML行为

11

奇异的列表行为

14

奇异的DateAdd行为

13

奇异的HTML行为

13

奇异的UIScrollView行为

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档