2011-10-17 188 views

回答

2

快速瀏覽一下the documentation for the Mat class沒有透露任何明顯的「轉換爲float**」操作,但你也許可以自己動手完成它:

Mat mat = (Mat_<float>(3,3) << 1, 0, 0, 0, 1, 0, 0, 0, 1); 

// allocate and initialize a 2d float array 
float **m = new float*[mat.Rows]; 
for (int r = 0; r < mat.Rows; ++r) 
{ 
    m[r] = new float[mat.Cols]; 
    for (int c = 0; c < mat.Cols; ++c) 
    { 
     m[r][c] = mat.at(r, c); 
    } 
} 

// (use m for something) 

// don't forget to clean up! 
for (int r = 0; r < mat.Rows; ++r) 
{ 
    delete[] m[r]; 
} 
delete[] m; 

如果您在使用float**時沒有死機,您可以使用std::vectorboost::multi_array來避免內存分配/釋放的尷尬,並減少泄漏的可能性。

使用Mat::ptr<float>(n)獲得float*n矩陣的第n行也許會有一些運氣,但是如果您不復制數據,我不確定您會保留多長時間該指針將保持有效。

+0

謝謝!代碼示例非常好! – 2011-10-17 13:24:45

1

如果你的意思是這樣,

float a[M][N]; //M and N are compile-time constants! 
float **p = a; //error 

那麼你不能做到這一點。

但是,你可以這樣做:

float (*p)[N] = a; //ok 

但是,如果不幫你,你想float**不惜任何代價,然後用兩個for循環,做手工,從a複製的每個元素到p