Решение Ax = b с собственной библиотекой в ​​c ++ - PullRequest
1 голос
/ 15 мая 2019

Я пытаюсь решить 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...