2016-04-11 14 views
0

iki 2 x 2 matrisler var ve örneğin OpenCV kullanarak onlardan tensör ürününü almak istiyorum:OpenCV tensör ürün

cv::Mat mat1 = (cv::Mat_<double>(2,2) << 1, 0, 0, 1); 
cv::Mat mat2 = (cv::Mat_<double>(2,2) << 0, 1, 1, 0); 

geçerli:

{ 
{0, 1}, 
{1, 0} 
} 
x 
{ 
{1, 0}, 
{0, 1} 
} 

= 

{ 
{0, 0, 1, 0}, 
{0, 0, 0, 1}, 
{1, 0, 0, 0}, 
{0, 1, 0, 0} 
} 

Yani böyle bir şey var İstediğim sonucu elde etmek için opencv içine yerleştirilmiş bazı tensör ürün fonksiyonu var mı?

cevap

1

OpenCV tensörlerde yerleşik işlemler sağlamaz. Bunun için diğer kütüphanelere güvenmelisin.


Ancak, ben tensörlerle hiçbir uzman değilim, ama bu (OpenCV hala hiçbir mevcut) bana bir Kronecker ürün gibi görünüyor.

[0, 1; 
1, 0] 

x 

[1, 0; 
0, 1] 

= 

[0, 0, 1, 0; 
0, 0, 0, 1; 
1, 0, 0, 0; 
0, 1, 0, 0] 

Kodu:

#include <opencv2/opencv.hpp> 
using namespace cv; 
using namespace std; 

Mat kron(const Mat& A, const Mat& B) 
{ 
    CV_Assert(A.channels() == 1 && B.channels() == 1); 

    Mat1d Ad, Bd; 
    A.convertTo(Ad, CV_64F); 
    B.convertTo(Bd, CV_64F); 

    Mat1d Kd(Ad.rows * Bd.rows, Ad.cols * Bd.cols, 0.0); 
    for (int ra = 0; ra < Ad.rows; ++ra) 
    { 
     for (int ca = 0; ca < Ad.cols; ++ca) 
     { 
      Kd(Range(ra*Bd.rows, (ra + 1)*Bd.rows), Range(ca*Bd.cols, (ca + 1)*Bd.cols)) = Bd.mul(Ad(ra, ca)); 
     } 
    } 
    Mat K; 
    Kd.convertTo(K, A.type()); 
    return K; 
} 

int main(int argc, char **argv) 
{ 
    Mat mat1 = (Mat_<double>(2, 2) << 0, 1, 1, 0); 
    Mat mat2 = (Mat_<double>(2, 2) << 1, 0, 0, 1); 

    Mat res = kron(mat1, mat2); 

    cout << mat1 << endl << endl; 
    cout << " x " << endl << endl; 
    cout << mat2 << endl << endl; 
    cout << " = " << endl << endl; 
    cout << res << endl; 

    return 0; 
} 
Eğer öyleyse , size gereken sonuç üretir aşağıda kodunda da rapor bir uygulama here bulabilirsiniz