2010-12-17 16 views
7

Yeni başlayanlar için olabilecek bir sorum var.Matris çarpımı

20x2 matrisini 2 ++ matrisiyle C++ olarak çarpmak istiyorum.

Ben OpenCV ile denedim ama bir hata alıyorum

İşte


cvarrToMat içinde

Kötü argüman (Bilinmeyen dizi tipi) Ben OpenCV kullanılan koddur

Eğer benim kod veya openCV sorunu ile sorunu kontrol etmek için sipariş ama hala çalışmıyor, dışarı hata ile derlemek, ama ben kodu test ederken sorun "Kötü argüman (Bilinmeyen dizi türü) cvarrToMat olsun "

#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

El ile nasıl yapıldığını biliyor musunuz? Elden başka bir yol mu arıyorsunuz? – Falmarri

+0

Bunu sorabilir miyim, neden bu çarpıma ihtiyacın var? Sadece merak. –

+9

Belki bazı cevapları kabul etmelisiniz. – GWW

cevap

-3

Aradığınız işlevin prototipini ve matrislerinizin ve aramanızın beyanını yayınlamalısınız. Herkesin bir openCV'ye aşina olduğunu sanmıyorum.

+1

Görünüş matrisinizi oluşturmanız gerekiyor. Örneğinizde, Mc'in CvMat'tan CvMat * 'a dek bildirimini değiştirin ve bunu başlatın: CvMat * Mc = cvCreateMat (2, 2, CV_32FC1); Bence bu işe yarayacak. Statik tip kontrolü geçeceğinden derleyici başlatılmamış diziyi yakalayamaz. –

4

Eh. Bu sorunun cevabı gerçekten birkaç şeye bağlıdır. Bunu el ile nasıl yapacağınızı bildiğinizi söylemişsinizdir, bu nedenle kod içinde bunu yapmak için matrislerinizi nasıl temsil ettiğinize bağlı olacaktır. Şimdi bu bir zaman meselesi ve cevabın sadece cevabına ihtiyacınız varsa, bunun için MATLAB gibi bir dil önerebilirim. Daha büyük bir programın parçasıysa ve verimli olması gereken çok fazla matris çarpımı yapacaksanız, boost::ublas gibi yüksek kaliteli bir optimize kitaplık öneririm.

Eğer bir zaman meselesi ve gerçekten C++ içinde yapmak istiyorsanız ve gerçekten bir üçüncü parti kütüphanesi nasıl kullanacağınızı/kullanmayı bilmediğinizi, (optimize edilmemiş) bir matris çarpımının nasıl olmasını istediğiniz gibi aşağıdaki:

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 kodunuzu karşılaştırıldığında, bu çıkış matrisi Mc başlatmak unuttuğunu görünüyor: docs göre

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)aynıdır.