vs中求教c2039问题 cwise不是Eigen的成员及2228类/结构/联合
DL·花哥 2018-02-15 03:54:55 #ifndef KERNELS_H
#define KERNELS_H
#include <Eigen/Core>
#include <cmath>
class Kernel
{
public:
virtual double Eval(const Eigen::VectorXd& x1, const Eigen::VectorXd& x2) const = 0;
virtual double Eval(const Eigen::VectorXd& x) const = 0;
};
class LinearKernel : public Kernel
{
public:
inline double Eval(const Eigen::VectorXd& x1, const Eigen::VectorXd& x2) const
{
return x1.dot(x2);
}
inline double Eval(const Eigen::VectorXd& x) const
{
return x.squaredNorm();
}
};
class GaussianKernel : public Kernel
{
public:
GaussianKernel(double sigma) : m_sigma(sigma) {}
inline double Eval(const Eigen::VectorXd& x1, const Eigen::VectorXd& x2) const
{
return exp(-m_sigma*(x1-x2).squaredNorm());
}
inline double Eval(const Eigen::VectorXd& x) const
{
return 1.0;
}
private:
double m_sigma;
};
class IntersectionKernel : public Kernel
{
public:
inline double Eval(const Eigen::VectorXd& x1, const Eigen::VectorXd& x2) const
{
return x1.cwise().min(x2).sum();
}
inline double Eval(const Eigen::VectorXd& x) const
{
return x.sum();
}
};
class Chi2Kernel : public Kernel
{
public:
inline double Eval(const Eigen::VectorXd& x1, const Eigen::VectorXd& x2) const
{
double result = 0.0;
for (int i = 0; i < x1.size(); ++i)
{
double a = x1[i];
double b = x2[i];
result += (a-b)*(a-b)/(0.5*(a+b)+1e-8);
}
return 1.0 - result;
}
inline double Eval(const Eigen::VectorXd& x) const
{
return 1.0;
}
};
class MultiKernel : public Kernel
{
public:
MultiKernel(const std::vector<Kernel*>& kernels, const std::vector<int>& featureCounts) :
m_n(kernels.size()),
m_norm(1.0/kernels.size()),
m_kernels(kernels),
m_counts(featureCounts)
{
}
inline double Eval(const Eigen::VectorXd& x1, const Eigen::VectorXd& x2) const
{
double sum = 0.0;
int start = 0;
for (int i = 0; i < m_n; ++i)
{
int c = m_counts[i];
sum += m_norm*m_kernels[i]->Eval(x1.segment(start, c), x2.segment(start, c));
start += c;
}
return sum;
}
inline double Eval(const Eigen::VectorXd& x) const
{
double sum = 0.0;
int start = 0;
for (int i = 0; i < m_n; ++i)
{
int c = m_counts[i];
sum += m_norm*m_kernels[i]->Eval(x.segment(start, c));
start += c;
}
return sum;
}
private:
int m_n;
double m_norm;
std::vector<Kernel*> m_kernels;
std::vector<int> m_counts;
};
#endif
上面蓝色处,出现错误如下
错误 1 error C2039: “cwise”: 不是“Eigen::Matrix<double,-1,1,0,-1,1>”的成员
错误 4 error C2039: “cwise”: 不是“Eigen::Matrix<double,-1,1,0,-1,1>”的成员
错误 2 error C2228: “.min”的左边必须有类/结构/联合
错误 5 error C2228: “.min”的左边必须有类/结构/联合
错误 3 error C2228: “.sum”的左边必须有类/结构/联合
错误 6 error C2228: “.sum”的左边必须有类/结构/联合
错误7 IntelliSense: class "Eigen::Matrix<double, -1, 1, 0, -1, 1>" 没有成员 "cwise"
求教。。