Я пытаюсь решить Ax = b, используя метод наименьших квадратов. Я использую библиотеку Eigen, чтобы решить эту проблему. Входными данными для моей функции являются матрица A (vector<vector<double>>
) и RhS vector<double>
b. Мне нужно преобразовать их в Eigen::MatrixXd
и Eigen :: VectorXd. Я мог бы легко конвертировать b в Eigen::VectorXd
. Но я не могу сформировать Eigen::MatrixXd
.
Спасибо за ваш ответ заранее.
Eigen::MatrixXd ConvertToEigenMatrix(std::vector<std::vector<double>> data)
{
Eigen::MatrixXd eMatrix(data.size(), data[0].size());
for (int i = 0; i < data.size(); ++i)
eMatrix.row(i) = Eigen::VectorXd::Map(&data[i][0], data[0].size());
return eMatrix;
}
std::vector<double> SolveUsingEigen(const std::vector<std::vector<double>>& A, const std::vector<double>& b)
{
std::vector<double> ans;
if (A.size() != b.size())
{
std::cout << "Invalid output" << std::endl;
return ans;
}
ans.reserve(b.size());
Eigen::VectorXd b_eig = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(const_cast<double*>(b.data()), b.size());
Eigen::MatrixXd A_eig = ConvertToEigenMatrix(A);
// Eigen::MatrixXd eig_ans = A_eig.colPivHouseholderQr().solve(b_eig);
Eigen::MatrixXd eig_ans = A_eig.bdcSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(b_eig);
std::vector<std::vector<double>> v;
for (int i = 0; i < eig_ans.rows(); ++i)
{
const double* begin = &eig_ans.row(i).data()[0];
v.push_back(std::vector<double>(begin, begin + eig_ans.cols()));
}
for (int i = 0; i < eig_ans.rows(); ++i)
for (int j = 0; j < eig_ans.cols(); ++j)
ans.push_back(v[i][j]);
return ans;
}