比较两个Eigen的值

时间:2018-02-14 16:02:17

标签: c++ c++11 eigen

我已经实现了一个减去三个向量的函数,然后对它们的系数求和。之后,我想比较系数,但编译器显示错误。以下是我的代码:

<DataGrid x:Name="dg" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Name}" Width="*" />
        <DataGridTextColumn Binding="{Binding Count}" Width="50" />
    </DataGrid.Columns>
</DataGrid>

编译器显示的错误如下:

void update_embedding_test(Eigen::TensorMap<Eigen::Tensor<float, 2, 1, long int>, 16, Eigen::MakePointer>* matrix_a, Eigen::TensorMap<Eigen::Tensor<float, 2, 1, long int>, 16, Eigen::MakePointer>* matrix_b, const int32 index_1, const int32 index_2, const int32 index_3, const int32 index_4, const int32 index_5, float* rate) {

auto v_1 = matrix_a->chip<0>(index_1); //get the first vector
auto v_2_a = matrix_b->chip<0>(index_2); //get the second vector
auto v_2_b = matrix_b->chip<0>(index_2); //get the third vector
auto v_3 = matrix_a->chip<0>(index_3); //get the fourth vector
auto v_4 = matrix_a->chip<0>(index_4); //get the fifth vector
auto v_5 = matrix_a->chip<0>(index_5); //get the sixth vector

auto sum_a = (v_1-v_3-v_2_a).sum(); //subtract the vectors and then sum the coefficients
auto sum_b = (v_4-v_5-v_2_b).sum(); //subtract the vectors and then sum the coefficients

std::cout << "sum_a: " << sum_a << "\n"; //e.g: -0.0268941
std::cout << "sum_b: " << sum_b << "\n\n"; //e.g: 0.0502871

if ((sum_a+1.f)>sum_b) { //compare the values
  std::cout << "sum_a>sum_b\n";
}
}

如何比较In member function 'void tensorflow::NegTrainWord2vecOp::update_embedding_test(Eigen::TensorMap<Eigen::Tensor<float, 2, 1, long int>, 16, Eigen::MakePointer>*, Eigen::TensorMap<Eigen::Tensor<float, 2, 1, long int>, 16, Eigen::MakePointer>*, tensorflow::int32, tensorflow::int32, tensorflow::int32, tensorflow::int32, tensorflow::int32, float*)': word2vec_kernels.cc:725:20: error: could not convert 'Eigen::TensorBase<Derived, 0>::operator>(const OtherDerived&) const [with OtherDerived = Eigen::TensorReductionOp<Eigen::internal::SumReducer<float>, const Eigen::DimensionList<long int, 1ul>, const Eigen::TensorCwiseBinaryOp<Eigen::internal::scalar_difference_op<float, float>, const Eigen::TensorCwiseBinaryOp<Eigen::internal::scalar_difference_op<float, float>, const Eigen::TensorChippingOp<0l, Eigen::TensorMap<Eigen::Tensor<float, 2, 1, long int>, 16, Eigen::MakePointer> >, const Eigen::TensorChippingOp<0l, Eigen::TensorMap<Eigen::Tensor<float, 2, 1, long int>, 16, Eigen::MakePointer> > >, const Eigen::TensorChippingOp<0l, Eigen::TensorMap<Eigen::Tensor<float, 2, 1, long int>, 16, Eigen::MakePointer> > >, Eigen::MakePointer>; Derived = Eigen::TensorCwiseUnaryOp<Eigen::internal::bind2nd_op<Eigen::internal::scalar_sum_op<float, float> >, const Eigen::TensorReductionOp<Eigen::internal::SumReducer<float>, const Eigen::DimensionList<long int, 1ul>, const Eigen::TensorCwiseBinaryOp<Eigen::internal::scalar_difference_op<float, float>, const Eigen::TensorCwiseBinaryOp<Eigen::internal::scalar_difference_op<float, float>, const Eigen::TensorChippingOp<0l, Eigen::TensorMap<Eigen::Tensor<float, 2, 1, long int>, 16, Eigen::MakePointer> >, const Eigen::TensorChippingOp<0l, Eigen::TensorMap<Eigen::Tensor<float, 2, 1, long int>, 16, Eigen::MakePointer> > >, const Eigen::TensorChippingOp<0l, Eigen::TensorMap<Eigen::Tensor<float, 2, 1, long int>, 16, Eigen::MakePointer> > >, Eigen::MakePointer> >; typename Eigen::internal::traits<T>::Scalar = float](sum_b)' from 'const Eigen::TensorCwiseBinaryOp<Eigen::internal::scalar_cmp_op<float, float, (Eigen::internal::ComparisonName)5u>, const Eigen::TensorCwiseUnaryOp<Eigen::internal::bind2nd_op<Eigen::internal::scalar_sum_op<float, float> >, const Eigen::TensorReductionOp<Eigen::internal::SumReducer<float>, const Eigen::DimensionList<long int, 1ul>, const Eigen::TensorCwiseBinaryOp<Eigen::internal::scalar_difference_op<float, float>, const Eigen::TensorCwiseBinaryOp<Eigen::internal::scalar_difference_op<float, float>, const Eigen::TensorChippingOp<0l, Eigen::TensorMap<Eigen::Tensor<float, 2, 1, long int>, 16, Eigen::MakePointer> >, const Eigen::TensorChippingOp<0l, Eigen::TensorMap<Eigen::Tensor<float, 2, 1, long int>, 16, Eigen::MakePointer> > >, const Eigen::TensorChippingOp<0l, Eigen::TensorMap<Eigen::Tensor<float, 2, 1, long int>, 16, Eigen::MakePointer> > >, Eigen::MakePointer> >, const Eigen::TensorReductionOp<Eigen::internal::SumReducer<float>, const Eigen::DimensionList<long int, 1ul>, const Eigen::TensorCwiseBinaryOp<Eigen::internal::scalar_difference_op<float, float>, const Eigen::TensorCwiseBinaryOp<Eigen::internal::scalar_difference_op<float, float>, const Eigen::TensorChippingOp<0l, Eigen::TensorMap<Eigen::Tensor<float, 2, 1, long int>, 16, Eigen::MakePointer> >, const Eigen::TensorChippingOp<0l, Eigen::TensorMap<Eigen::Tensor<float, 2, 1, long int>, 16, Eigen::MakePointer> > >, const Eigen::TensorChippingOp<0l, Eigen::TensorMap<Eigen::Tensor<float, 2, 1, long int>, 16, Eigen::MakePointer> > >, Eigen::MakePointer> >' to 'bool' if ((sum_a+1.f)>sum_b) { sum_a

更新:问题不是计算sum_b,而是将其放入if((sum_a+1.f)>sum_b)。 link表示if((sum_a+1.f)>sum_b)返回* this和other的系数方式==运算符的表达式。但问题仍然存在......如何将operator>()放入(sum_a+1.f)>sum_b声明?

1 个答案:

答案 0 :(得分:0)

通过阅读文档,.sum()的返回类型是DenseBase对象。我们可以使用DenseBase函数

比较具有指定精度的两个isApprox个对象

请参阅https://eigen.tuxfamily.org/dox/classEigen_1_1DenseBase.html#ae8443357b808cd393be1b51974213f9c