#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"
求教。。
uj5u.com熱心網友回復:
初學者 最好身邊有會的 愿意指導你 不如學習太慢了uj5u.com熱心網友回復:
cwiseMin ?轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/75381.html
標籤:圖形處理/算法
