簡體   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