by Anonymous » 31 Aug 2025, 12:22
Ich habe ein Python -Programm, mit dem ein Gleichungssystem verwendet wird, das die Methode der kleinsten Quadrate verwendet
Code: Select all
np.linalg.lstsq(left_hand, right_hand, rcond=None)
Ich muss eine Funktion in C ++ schreiben, die das gleiche wie das Python -Programm tut. Mein erster Ansatz dafür bestand darin
Code: Select all
cv::solve(equationSystem, equationsRightSide, solutions, cv::DECOMP_SVD);
Obwohl ihre Ergebnisse die meiste Zeit sehr ähnlich sind, unterscheiden sie sich manchmal um ziemlich viel. Zum Beispiel für ein System mit 3 Variablen: < /p>
ergibt diese Lösung: [0,0008230780686749673; 0,001646156137349933; 8.470329472543003E-20]
ergibt diese Lösung: [-8.76551484e-05 1.41121756e-03 8.6237999e-04]
Ich verstehe, dass dies am wahrscheinlichsten ist, weil CV :: Lösung und np.lininalg.Lininalg. Mit CV :: Solve können Sie nur die Matrix -Dezositionsmethode festlegen, während LSTSQ viele weitere Argumente enthält. Daher versuche ich, nach alternativen Funktionen zu suchen, um die C ++ - Version zu implementieren. Ich habe Eigen mit dem folgenden Code ausprobiert: < /p>
Code: Select all
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
Ich habe ein Python -Programm, mit dem ein Gleichungssystem verwendet wird, das die Methode der kleinsten Quadrate verwendet[code]np.linalg.lstsq(left_hand, right_hand, rcond=None)[/code]
Ich muss eine Funktion in C ++ schreiben, die das gleiche wie das Python -Programm tut. Mein erster Ansatz dafür bestand darin[code]cv::solve(equationSystem, equationsRightSide, solutions, cv::DECOMP_SVD);[/code]
Obwohl ihre Ergebnisse die meiste Zeit sehr ähnlich sind, unterscheiden sie sich manchmal um ziemlich viel. Zum Beispiel für ein System mit 3 Variablen: < /p>
[code]cv::solve()[/code] ergibt diese Lösung: [0,0008230780686749673; 0,001646156137349933; 8.470329472543003E-20]
[code]np.linalg.lstsq()[/code] ergibt diese Lösung: [-8.76551484e-05 1.41121756e-03 8.6237999e-04]
Ich verstehe, dass dies am wahrscheinlichsten ist, weil CV :: Lösung und np.lininalg.Lininalg. Mit CV :: Solve können Sie nur die Matrix -Dezositionsmethode festlegen, während LSTSQ viele weitere Argumente enthält. Daher versuche ich, nach alternativen Funktionen zu suchen, um die C ++ - Version zu implementieren. Ich habe Eigen mit dem folgenden Code ausprobiert: < /p>
[code]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