C ++ - Äquivalent von Pythons numpy.linalg.lstsqPython

Python-Programme
Anonymous
 C ++ - Äquivalent von Pythons numpy.linalg.lstsq

Post by Anonymous »

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>

Code: Select all

cv::solve()
ergibt diese Lösung: [0,0008230780686749673; 0,001646156137349933; 8.470329472543003E-20]

Code: Select all

np.linalg.lstsq()
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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post