C++與Matlab混合編程之:矩陣數據結構

    項目須要將matlab代碼寫成C++,準備用opencv。opencv中矩陣的存儲與matlab有所不一樣,應注意如下問題:函數

一、matlab中矩陣是按照列優先存儲的。對於n0*n1*...*nn維的矩陣,具體存儲方式是:(a0(0),a1(0),...,an(0)),(a0(1),a1(0),...an(0)), (a0(n0),a1(0),...an(0)),(a0(0),a1(1),a2(0),...an(0)),...(a0(0),a1(0),...,an(nn)).即先遍歷a0,再遍歷a1,a2,...,an.內存

二、opencv中矩陣的存儲方式是行優先的,與matlab相反。opencv

三、對於三維矩陣,在opencv中我常使用一個多通道的二維矩陣代替。如建立一個100*10*20的矩陣:遍歷

Mat a(100,10,CV_32SC(20));方法

    也能夠直接建立一個三維矩陣:項目

    int sz[]={100,10,20};
matlab

    Mat a(sz,CV_32S);co

四、對於遍歷矩陣的操做,儘可能使矩陣元素在內存中連續。我常使用下面的方法遍歷矩陣:data

double *data=(double *)a.data;ab

for(int i=0;i<a.rows;++i){

    for(int j=0;j<a.cols;++j){

        *(data++)=........

    }

}

五、矩陣的初始化

opencv新建一個矩陣後並不會自動初始化,若是須要初始化須要自行操做。opencv提供了setTo函數:

//初始化一個32通道的矩陣,第32通道初始化爲1,其餘通道初始化爲0

Mat a(100,100,CV_32SC(32));

Vec<int,32>val;

val=0;

val[31]=1;

a.setTo(val);

相關文章
相關標籤/搜索