繁体   English   中英

如何使用C ++将2D矩阵的元素垂直复制到1D数组

[英]How to copy elements of 2D matrix to 1D array vertically using c++

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

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进行转置,然后再将其复制到数组。

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

要么

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

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

您可以进行优化以使其更易于缓存,即可以按块进行复制,以跟踪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.
        }
    }
}

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

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

例如,上层函数将矩阵与另一个矩阵相乘,然后在到达必要的列时,会缓存到一个临时数组中,以便您以后可以按连续顺序访问它的元素。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM