Код: Выделить всё
np.linalg.lstsq(left_hand, right_hand, rcond=None)Мне нужно написать функцию в C ++, которая выполняет то же самое, что и эта программа Python. Мой первый подход к этому был использование OpenCV CV :: Reolpe
Код: Выделить всё
cv::solve(equationSystem, equationsRightSide, solutions, cv::DECOMP_SVD);Однако, хотя их результаты очень похожи большую часть времени, иногда они отличаются довольно много. Например, для системы с 3 переменными: < /p>
c ++ дает это решение: [0,0008230780686749673; 0,001646156137349933; 8.470329472543003e-20]
Python yields this solution: [-8.76551484e-05 1.41121756e-03 8.62337999e-04]
I understand that this is most likely because cv::solve and np.linalg.lstsq не используйте один и тот же алгоритм и/или параметры, но cv :: solve только позволяет устанавливать метод матрицы разложения, в то время как LSTSQ имеет гораздо больше аргументов. Таким образом, я пытаюсь найти альтернативные функции для реализации версии C ++. Я пробовал собственное со стороны следующего кода: < /p>
Код: Выделить всё
Eigen::JacobiSVD svd(
ES_Eigen, Eigen::ComputeThinU | Eigen::ComputeThinV);
// In Python, if rcond = None, linalg.lstsq calculates the rcond value as the machine's precision
// times the greatest between the equations right side's columns and rows
double rcond = std::numeric_limits::epsilon() * std::max(equationsRightSide.rows, equationsRightSide.cols);
svd.setThreshold(rcond);
Eigen::VectorXd x = svd.solve(RS_Eigen);
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79751381/c-equivalent-of-pythons-numpy-linalg-lstsq[/url]
Мобильная версия