使用 Eigen 实现 CosineSimilarity 函数

1 简介

Eigen 是一个高效、易于使用的C++模板库,广泛应用于线性代数计算。本文将介绍如何使用 Eigen 实现 CosineSimilarity 函数,这是一种常用的相似度度量方法,可以用于衡量两个向量之间的相似程度。通过 Eigen 的矩阵运算和向量运算,我们可以快速、准确地实现 CosineSimilarity 函数,提高机器学习模型的训练和推理效率。

2 实现 NormalizeL2

bool NormalizeL2(std::vector<float> &input_data) {
  if (input_data.empty()) {
	return false;
  }
  // 将std::vector<float> 转换为 Eigen::Map
  Eigen::Map<Eigen::VectorXf> eigen_vector(input_data.data(), static_cast<long>(input_data.size()));
  eigen_vector.normalize();
  return true;
}

3 实现 CosineSimilarity

double CosineSimilarity(const std::vector<T> &a, const std::vector<T> &b, bool use_normalize = false) {
  if ((a.size() != b.size()) && (a.empty()) || (b.empty())) {
    BDLOGGER_ERROR(
        "The size of Vector A and B must be equal and greater than 0. But the size of vector A is {}, while the size of vector B is also {}.",
        a.size(),
        b.size())
    return 0;
  }

  Eigen::Map<const Eigen::VectorXf> eigen_vector_a(a.data(), static_cast<long>(a.size()));
  Eigen::Map<const Eigen::VectorXf> eigen_vector_b(b.data(), static_cast<long>(b.size()));
  if (use_normalize) {
    return eigen_vector_a.dot(eigen_vector_b) / (eigen_vector_a.norm() * eigen_vector_b.norm());
  } else {
    return eigen_vector_a.dot(eigen_vector_b);
  }
}

4 参考文档

posted @ 2024-11-30 11:16  Zheng-Bicheng  阅读(98)  评论(0)    收藏  举报