2013-02-06 17 views
6

OpenCV के cvSolve एक रेखीय हल कर सकते हैं कम से कम वर्गों समस्या OpenCV में वर्गों:भारित रैखिक कम से कम इस तरह

// model: y = a1*x1 + a2*x2 + a3 
CvMat *y = cvCreateMat(N, 1, CV_64FC1); 
CvMat *X = cvCreateMat(N, 3, CV_64FC1); 
CvMat *coeff = cvCreateMat(3, 1, CV_64FC1); 

// fill vector y and matrix X 
for (int i=0; i<N; ++i) 
{ 
    cvmSet(y, i, 0, my_y_value(i)); 
    cvmSet(X, i, 0, my_x1_value(i)); 
    cvmSet(X, i, 1, my_x2_value(i)); 
    cvmSet(X, i, 2, 1); 
} 

cvSolve(X, y, coeff, CV_SVD); 
// now coeff contains a1, a2, a3 

हालांकि, मैं अपने डेटा बिंदुओं के लिए अलग अलग वजन आवेदन करना चाहते हैं। मैं वजन कैसे लागू करूं?

उत्तर

4

मुझे पता चला कि यह वास्तव में है कि मुश्किल नहीं है:

for (int i=0; i<N; ++i) 
{ 
    double w = weight(i); 

    cvmSet(y, i, 0, w * my_y_value(i)); 
    cvmSet(X, i, 0, w * my_x1_value(i)); 
    cvmSet(X, i, 1, w * my_x2_value(i)); 
    cvmSet(X, i, 2, w); 
} 

cvSolve(X, y, coeff, CV_SVD); 

यह टुकड़ा बस दोनों बाएं हाथ की ओर और वजन w के साथ रेखीय समीकरण का दाएँ हाथ की ओर गुणा। नमूना i के लिए त्रुटि शब्द प्रभावी ढंग से w² द्वारा गुणा किया जाता है।

+0

my_y_value, my_x1_value और my_x2_value क्या है? – Abc

+0

वे आपके मैट्रिक्स (x1, x2) और बाएं हाथ की ओर (y) के मान प्रदान करने के लिए हैं। यह केवल सबसे सामान्य रूप है, आप कोड को फिर से लिख सकते हैं और मूल्यों को प्रदान कर सकते हैं जो भी आपको सबसे अच्छा लगा। सीवीएसओल्व के लिए ओपनसीवी दस्तावेज़ों को भी देखना सुनिश्चित करें। – Hendrik

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^