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"

求教。。
...全文
995 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2018-02-17
  • 打赏
  • 举报
回复
cwiseMin ?
  • 打赏
  • 举报
回复
初学者 最好身边有会的 愿意指导你 不如学习太慢了

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧