2010-12-17 28 views
7

मेरे पास एक प्रश्न है जो शुरुआती लोगों के लिए हो सकता है।मैट्रिक्स गुणा

मैं सी ++ में 2x2 मैट्रिक्स द्वारा 20x2 मैट्रिक्स को गुणा करना चाहता हूं।

मैं openCV साथ यह कोशिश की, लेकिन मैं एक त्रुटि है जो मिल

बुरा तर्क (अज्ञात सरणी प्रकार) cvarrToMat


यहाँ में कोड है कि मैं में openCV में प्रयोग किया जाता है अगर यह मेरे कोड या ओपनसीवी में समस्या के साथ समस्या की जांच करने के लिए आदेश है, लेकिन यह अभी भी काम नहीं कर रहा है, तो मैं त्रुटि से संकलित कर सकता हूं, लेकिन जब मैं कोड का परीक्षण करता हूं तो मुझे समस्या मिलती है "cvarrToMat में खराब तर्क (अज्ञात सरणी प्रकार) "

#include <stdio.h> 
#include <stdlib.h> 
//#include "/usr/include/opencv/cv.h" 
#include <cv.h> 
#include <cvaux.h> 
#include <highgui.h> 
#include <math.h> 
#include <iostream> 

    int main() 
{ 


double a[] = {1, 2, 3, 4}; 
CvMat Ma; 
cvInitMatHeader(&Ma, 2, 2, CV_32FC1, a); 


double b[] ={0, -1, 1, 0}; 

CvMat Mb; 
cvInitMatHeader(&Mb, 2, 2, CV_32FC1, b); 

CvMat Mc; 
CvMat Mc1; 
cvMatMul(&Ma, &Mb, &Mc); 

return 0; 
} 
+0

क्या आप जानते हैं कि हाथ से इसे कैसे किया जाए? क्या आप हाथ से अलग रास्ता तलाश रहे हैं? – Falmarri

+0

क्या मैं पूछ सकता हूं, आपको इस गुणा की आवश्यकता क्यों है? बस उत्सुक। –

+9

शायद आपको कुछ जवाब स्वीकार करना चाहिए। – GWW

उत्तर

-3

हो सकता है कि आपको उस फ़ंक्शन के प्रोटोटाइप को पोस्ट करना चाहिए, साथ ही साथ आपके मैट्रिक्स और आपकी कॉल की घोषणा भी होनी चाहिए। मुझे नहीं लगता कि हर कोई ओपनसीवी से परिचित है।

+1

ऐसा प्रतीत होता है कि आपको अपना आउटपुट मैट्रिक्स बनाना होगा। अपने उदाहरण में, सीवीएमएटी से सीवीमैट * तक मैक की घोषणा बदलें और इसे प्रारंभ करें: सीवीएमएटी * मैक = सीवीक्रेटमैट (2, 2, सीवी_32 एफसी 1); मुझे लगता है कि यह काम करेगा। कंपाइलर अनियमित सरणी नहीं पकड़ सकता है, क्योंकि स्थिर प्रकार की जांच पास हो जाएगी। –

4

ठीक है। इस सवाल का जवाब वास्तव में कुछ चीजों पर निर्भर करता है। आपने कहा है कि आप जानते हैं कि हाथ में ऐसा कैसे करें ताकि कोड में ऐसा किया जा सके, यह इस बात पर निर्भर करेगा कि आप अपने matrices का प्रतिनिधित्व कैसे करते हैं। अब अगर यह एक बार बात है और आपको इसके जवाब की आवश्यकता है, तो मैं इसके लिए बनाई गई MATLAB जैसी भाषा का सुझाव दूंगा। यदि यह एक बड़े कार्यक्रम का हिस्सा है और आप बहुत सारे मैट्रिक्स गुणा कर रहे हैं जिन्हें कुशल होने की आवश्यकता है, तो मैं boost::ublas जैसे उच्च गुणवत्ता वाले अनुकूलित लाइब्रेरी की अनुशंसा करता हूं।

यदि यह एक बार की बात है और आप वास्तव में इसे सी ++ में करना चाहते हैं और आप वास्तव में नहीं चाहते हैं कि किसी तीसरे पक्ष की लाइब्रेरी का उपयोग कैसे करें, जैसे ublas, एक (अनुकूलित नहीं) मैट्रिक्स गुणा करना पसंद करेंगे निम्नलिखित:

template<typename T> 
struct matrix2d 
{ 
private: 
    std::vector<std::vector<T>> data; 
    size_t _rows, _columns; 
public: 
    matrix2d(size_t rows, size_t columns) 
     :_rows(rows) 
     ,_columns(columns) 
    { 
     data.resize(_rows, std::vector<T>(_columns)); 
    } 

    size_t rows() const { return _rows; } 
    size_t columns() const { return _columns; } 

    T& operator()(size_t row, size_t column) 
    { 
     return data[row][column]; 
    } 

    const T& operator()(size_t row, size_t column) const 
    { 
     return data[row][column]; 
    } 
}; 

template<typename T> 
void mmult(const matrix2d<T>& m1, const matrix2d<T>&m2, matrix2d<T>& result) 
{ 
    for (size_t r = 0 ; r<m1.rows() ; ++r) 
     for (size_t c = 0; c<m2.columns() ; ++c) 
      for (size_t n = 0; n<m1.columns() ; ++n) 
       result(r, c) = m1(r, n) * m2(n, c); 
} 


int main() 
{ 

    matrix2d<double> m1(20, 2); 
    matrix2d<double> m2(2, 2); 
    matrix2d<double> result(m1.rows(), m2.columns()); 
    mmult(m1, m2, result); 
} 
5

example in the OpenCV docs के साथ अपने कोड की तुलना करना, ऐसा लगता है कि आप उत्पादन मैट्रिक्स Mc प्रारंभ करने में भूल गया:

double a[] = { 1, 2, 3, 4, 
       5, 6, 7, 8, 
       9, 10, 11, 12 }; 

double b[] = { 1, 5, 9, 
       2, 6, 10, 
       3, 7, 11, 
       4, 8, 12 }; 

double c[9]; 
CvMat Ma, Mb, Mc ; 

cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a); 
cvInitMatHeader(&Mb, 4, 3, CV_64FC1, b); 
cvInitMatHeader(&Mc, 3, 3, CV_64FC1, c); 

cvMatMulAdd(&Ma, &Mb, 0, &Mc); 
// the c array now contains the product of a (3x4) and b (4x3) 

डॉक्स के अनुसार, cvMatMul(&Ma, &Mb, &Mc)रूप में ही है।

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