2017-12-24 19 views
-1

Mat(対称行列)を直角三角で1行に線形化する方法。私が持っているたとえば 、:Opencv Mat効率を直角三角で線形化

0aabbb 
b0aaaa 
ba0bba 
bac0aa 
aaaa0c 
abcab0 

、その後、そこから私が手に:

aabbbaaaabbaaac 

このような何か:

... 
template<class T> 
Mat SSMJ::triangleLinearized(Mat mat){ 
    int c = mat.cols; 
    Mat row = Mat(1, ((c*c)-c)/2, mat.type()); 
    int i = 0; 
    for(int y = 1; y < mat.rows; y++) 
    for(int x = y; x < mat.cols; x++) { 
     row.at<T>(i)=mat.at<T>(y, x); 
     i++; 
    } 
    return row; 
} 
... 

答えて

0

あなたのマット内のデータがちょうど1次元配列であるので、 row.dataに格納されているので、必要なものを何でもできます。私はあなたがこの配列からコピーするだけではなく、もっと特殊なもの(ベクトル化されたメソッドを使用しない)を見つけることはないと思います。

int rows = 6; 
char data[] = { 0,1,2,3,4,5, 
       0,1,2,3,4,5, 
       0,1,2,3,4,5, 
       0,1,2,3,4,5, 
       0,1,2,3,4,5}; 
char result[100]; 
int offset = 0; 
for (int i = 0; i < 5; offset += 5-i, i++) { 
    memcpy(&result[offset] , &data[rows * i + i + 1], 5 - i); 
} 

またはOpenCVのマットでそれは次のようになり

int rows = mat.cols; 
char result[100]; // you can calculate how much data u need 
int offset = 0; 
for (int i = 0; i < 5; offset += 5-i, i++) { 
    memcpy(&result[offset] , &mat.data[rows * i + i + 1], 5 - i); 
} 
Mat resultMat(1, offset, result);