直角三角形线性化的Opencv Mat效率
Opencv Mat efficiency linearized by right triangle
如何通过直角三角形将线性化的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;
}
...
由于垫子中的数据只是存储在 row.data 中的一维数组,因此您可以随心所欲地使用它。我不认为你会发现比从这个数组中复制更特别的东西(w/o 使用矢量化方法)。
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 Mat 它将是
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);
如何通过直角三角形将线性化的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;
}
...
由于垫子中的数据只是存储在 row.data 中的一维数组,因此您可以随心所欲地使用它。我不认为你会发现比从这个数组中复制更特别的东西(w/o 使用矢量化方法)。
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 Mat 它将是
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);