D:\ZBY\ZBYQT\VarTst\main.cpp:45: error: no matching function for call to 'Eigen::Matrix<double, -1, -1>::mean(int)' b_ = y.mean() - A_.transpose() * X.mean(0); ^
时间: 2024-02-14 08:03:18 浏览: 200
这个错误可能是因为您的 Eigen 版本太旧,不支持 `mean()` 方法。您可以尝试更新 Eigen 版本,或者使用 Eigen 的 `MatrixBase` 类型和 `mean()` 函数来计算均值。
以下是使用 `MatrixBase` 和 `mean()` 函数来计算均值的修改后的代码:
```c++
#include <iostream>
#include <vector>
#include <cmath>
#include <Eigen/Dense>
using namespace Eigen;
class VARModel {
public:
VARModel(int p);
void addObservation(const VectorXd& observation);
void estimateCoefficients();
VectorXd predict(int steps);
private:
int p_;
int n_;
std::vector<VectorXd> observations_;
MatrixXd A_;
VectorXd b_;
};
VARModel::VARModel(int p) : p_(p), n_(0), A_(p, p), b_(p) {
A_.setZero();
b_.setZero();
}
void VARModel::addObservation(const VectorXd& observation) {
if (n_ == 0) {
n_ = observation.size();
}
observations_.push_back(observation);
}
void VARModel::estimateCoefficients() {
int T = observations_.size() - p_;
MatrixXd X(T, p_ * n_);
VectorXd y(T * n_);
for (int i = 0; i < T; ++i) {
for (int j = 0; j < p_; ++j) {
X.block(i, j * n_, 1, n_) = observations_[i + j].transpose();
}
y.segment(i * n_, n_) = observations_[i + p_];
}
A_ = (X.transpose() * X).inverse() * X.transpose() * y;
b_ = y.mean() - A_.transpose() * X.colwise().mean();
}
VectorXd VARModel::predict(int steps) {
VectorXd prediction(n_ * steps);
VectorXd x(n_ * p_);
for (int i = 0; i < p_; ++i) {
x.segment(i * n_, n_) = observations_.back() - b_;
}
for (int i = 0; i < steps; ++i) {
x.segment(0, n_ * (p_ - 1)) = x.segment(n_, n_ * (p_ - 1));
x.segment(n_ * (p_ - 1), n_) = A_.transpose() * x + b_;
prediction.segment(i * n_, n_) = x.segment(n_ * (p_ - 1), n_);
}
return prediction;
}
int main() {
int p = 2;
VARModel model(p);
VectorXd observation(2);
observation << 1.0, 2.0;
for (int i = 0; i < 10; ++i) {
model.addObservation(observation);
observation += VectorXd::Random(2);
}
model.estimateCoefficients();
VectorXd prediction = model.predict(5);
std::cout << "Predictions: " << std::endl << prediction << std::endl;
return 0;
}
```
在这个修改后的实现中,我们使用 `colwise()` 方法和 `mean()` 函数来计算矩阵的每一列的均值,得到一个 p 维向量。然后,我们使用这个向量来计算 b。
阅读全文