背景:
我正在用C ++将最小二乘算法编写成一个类,我想确保我所做的是最有效和最快的。我使用Eigen库来编写所有子例程来为美式期权合约定价。我还没有完成算法,但我完成了大部分子程序,并测试它们以确保它们正常工作。
问题:
当我在Eclipse上构建它时,我从Eigen得到了这个未知错误:
gsub("(.*\\-\\d*)[a-z]*", "\\1", s, ignore.case = TRUE)
我不确定问题是什么。
这是我的头文件:
c:\mingw\include\c++\6.2.0\eigen\src/Core/PlainObjectBase.h:774:7: error: static assertion failed: FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED
EIGEN_STATIC_ASSERT(is_integer,
以下是相关的.cpp文件:
#include <vector>
#include <Eigen/Dense>
#include <Eigen/Geometry>
#ifndef LSM_H
#define LSM_H
class LSM {
public:
// Overload Constructor
LSM(const double, const double, const double, const int, const int, const double, const double, const int, const int);
// Destructor
~LSM();
// Generate the Laguerre Polynomials
Eigen::MatrixXd Laguerre(Eigen::VectorXd, const int);
// Generate Gaussian noise
// Generate M paths of stock prices (Geometric Brownian Motion)
Eigen::VectorXd GBM(const int, const int, const double, const double, const double, const double, const double);
// Generate time paths
Eigen::VectorXd timepaths(const double, const double, const double);
// Payoff of call option
Eigen::VectorXd callPayoff(Eigen::VectorXd, const double);
// Payoff of put option
Eigen::VectorXd putPayoff(Eigen::VectorXd, const double);
// Find function for finding the paths that are in the money (call option)
Eigen::VectorXd Findcallpath(Eigen::VectorXd, const double);
// Find function for finding the paths that are in the money (put option)
Eigen::VectorXd Findputpath(Eigen::VectorXd, const double);
// Find price of call given path
Eigen::VectorXd Findcallprices(Eigen::VectorXd, Eigen::VectorXd);
// Find price of put given path
Eigen::VectorXd Findputprices(Eigen::VectorXd, Eigen::VectorXd);
// Find return of call (stock price - strike price)
Eigen::VectorXd Findcallreturn(Eigen::VectorXd, const double);
// Find return of put (strike price - stock price)
Eigen::VectorXd Findputreturn(Eigen::VectorXd, const double);
// Using Two-sided Jacobi SVD decomposition of a rectangular matrix
Eigen::VectorXd Jacobi(Eigen::MatrixXd, Eigen::VectorXd);
private:
// Member variables
double new_r;
double new_q;
double new_sigma;
int new_T;
int new_N;
double new_K;
double new_S0;
int new_M;
int new_R;
};
#endif
答案 0 :(得分:1)
您只需按照编译器错误消息查找代码中的违规行,该行位于函数LSM::timepaths
中,您将传递一个双精度来构造VectorXd
:
VectorXd LSM::timepaths(const double min, const double max, const double N)
{
VectorXd m(N + 1);
[...]
应该是:
VectorXd m(int(N) + 1);
对于记录,在.cpp文件中复制代码后,编译器会说:
../eigen/Eigen/src/Core/PlainObjectBase.h:779:27: error: no member named 'FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED' in 'Eigen::internal::static_assertion<false>'
FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED)
^
../eigen/Eigen/src/Core/Matrix.h:296:22: note: in instantiation of function template specialization 'Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >::_init1<double>' requested here
Base::template _init1<T>(x);
^
foo.cpp:166:21: note: in instantiation of function template specialization 'Eigen::Matrix<double, -1, 1, 0, -1, 1>::Matrix<double>' requested here
Eigen::VectorXd m(N + 1);
^
这不能更明确。
编辑:还有更多问题,例如使用double索引VectorXd:
Eigen::VectorXd C, S, path;
C(i) = S(path(i));
请使用Eigen::VectorXi
或std::vector<int>
来保存索引。