C ++ эквивалент Python's numpy.linalg.lstsqC++

Программы на C++. Форум разработчиков
Ответить
Гость
 C ++ эквивалент Python's numpy.linalg.lstsq

Сообщение Гость »

У меня есть программа Python, которая решает систему уравнений, используя метод наименьших квадратов, используя следующий вызов Linalg.lstsq :

Код: Выделить всё

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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»