0

我有一个二维矩阵,我想以一种有效的方式将其值垂直复制到一维数组,如下所示。

Matrice(3x3)
[1   2   3;
 4   5   6;
 7   8   9]

myarray:
{1,4,7,2,5,8,3,6,9}

1000x750x3 图像的蛮力需要 0.25 秒。我不想使用向量,因为我给myarray另一个函数(我没有写这个函数)作为输入。那么,有没有我可以使用的 c++ 或 opencv 函数?请注意,我使用的是 opencv 库。

将矩阵复制到数组也可以,我可以先对Mat进行转置,然后将其复制到数组。

4

4 回答 4

2
cv::Mat transposed = myMat.t();
uchar* X = transposed.reshape(1,1).ptr<uchar>(0);

或者

int* X = transposed.reshape(1,1).ptr<int>(0);

取决于您的矩阵类型。它可能会复制数据。

于 2013-08-26T20:18:16.287 回答
1

您可以对其进行优化以使其对缓存更加友好,即您可以按块复制,跟踪 myArray 中的位置,即数据应该到的位置。关键是,您的蛮力方法很可能会使对矩阵的每次访问都脱离缓存,这会对性能产生巨大影响。因此,最好在考虑缓存行大小的情况下复制垂直/水平。

请参阅下面的想法(我没有对其进行测试,因此它很可能存在错误,但它应该使想法清晰)。

size_t cachelinesize = 128/sizeof(pixel); // assumed cachelinesize of 128 bytes
struct pixel
{
   char r;
   char g;
   char b;
};
array<array<pixel, 1000>, 750> matrice;
vector<pixel> vec(1000*750);

for (size_t row = 0; row<matrice.size; ++row)
{
    for (size_t col = 0; col<matrice[0].size; col+=cachelinesize)
    {
        for (size_t i = 0; i<cachelinesize; ++i)
        {
            vec[row*(col+i)]=matrice[row][col+i]; // check here, if right copy order. I didn't test it.
        }
    }
}
于 2013-08-26T09:43:58.907 回答
0

如果您在垂直分配/查询之前使用矩阵,那么您可以在点击列的每个元素时缓存必要的列。

 //Multiplies and caches
 doCalcButCacheVerticalsByTheWay(myMatrix,calcType,myMatrix2,cachedColumns); 
 instead of
 doCalc(myMatrix,calcType,myMatrix2); //Multiplies
 then use it like this:
 ...
 tmpVariable=cachedColumns[i];
 ...

例如,upper 函数将矩阵与另一个矩阵相乘,然后当达到必要的列时,缓存到一个临时数组中,这样您就可以稍后以连续的顺序访问它的元素。

于 2013-08-26T09:40:08.827 回答
0

我认为 Mat::reshape 是你想要的。它不复制数据。

于 2013-08-26T10:37:15.457 回答