2016-02-22 65 views
2

我是Eigen的初學者。我已經搜索,但沒有找到這個問題的答案。如何從雙指針數組中創建Eigen :: VectorXd

我有一個雙指針數組,即我無法控制的double** x。它採用這種格式,我無能爲力。我想構造一個Eigen::VectorXd vec,它使用與x指向的內存相同的內存。

換句話說,我想下面是成立的:

vec(i) == *(x[i]) for each i 

&vec(i) == x[i] for each i 

我希望這是有道理的。我怎樣才能做到這一點?

在此先感謝!

回答

1

你想使用一系列Eigen::Map s,但有一個警告:它不是&vec等於x[i]而是vec.data()。下面是一個完整的例子:

#include "Eigen/Core" 
#include <iostream> 

int main() 
{ 
    int outerLength = 4; 

    int *szPointer; 
    double **dblPointer; 

    szPointer = new int[outerLength]; 
    dblPointer = new double*[outerLength]; 

    for (int i = 0; i < outerLength; i++) 
    { 
     szPointer[i] = 3 + i; 
     dblPointer[i] = new double[szPointer[i]]; 
    } 

    for (int i = 0; i < outerLength; i++) 
    { 
     Eigen::Map<Eigen::VectorXd> mapThatActsLikeVector(dblPointer[i], szPointer[i]); 
     mapThatActsLikeVector.setLinSpaced(0, 8); 

     std::cout << "----------------------------------\n"; 
     std::cout << "Eigen Map :\t" << mapThatActsLikeVector.transpose() << "\n"; 
     std::cout << "dblPointer:\t" << dblPointer[i][0]; 
     for (int j = 1; j < szPointer[i]; j++) 
     { 
      std::cout << " " << dblPointer[i][j]; 
     } 

     std::cout << "\n\nAddresses:\n"; 
     std::cout << "Eigen:\t" << mapThatActsLikeVector.data() << "\n"; 
     std::cout << "Raw :\t" << dblPointer[i] << "\n\n"; 
    } 

    for (int i = 0; i < outerLength; i++) 
    { 
     delete[] dblPointer[i]; 
    } 
    delete[] dblPointer; 
    delete[] szPointer; 

    return 0; 
} 

,其輸出是這樣的:


徵地圖:0 4 8
dblPointer:0 4 8

地址:
徵: 00622B00
原始:00622B00


徵地圖:0 2.66667 5.33333 8
dblPointer:0 2.66667 5.33333 8

地址:
徵:0061D218
原材料:0061D218


徵地圖:0 2 4 6 8
dblPointer:0 2 4 6 8

Addre的SSE:
徵:0061D240
原材料:0061D240


徵地圖:0 1.6 3.2 4.8 6.4 8
dblPointer:0 1.6 3.2 4.8 6.4 8

地址:
徵:006204B0
原始:006204B0

如果您想使用單個VectorXd -like對象,請參閱this問題。

+0

感謝您的回答,並對我遲到的回覆感到抱歉。但是,我認爲你誤解了我的問題,或者我不清楚。 x在我的文章中包含指向我在我的Eigen :: VectorXd中需要的變量的指針,即它們不是(必然)在連續的內存中。我希望* x [0]是vec中的第一個值,* x [1]第二個,等等。 – DoubleTrouble

+0

因爲我希望使用Unsupported Levenerg Marquardt求解器,所以它並不重要,但它好像不是反正支持Eigen :: Maps。不過,我仍然很想知道我的OP是否可以解決。 – DoubleTrouble

0

從雙** xarray開始,它有nrow和ncol。

xarray = new double *[nrow]; 
    for (i = 0; i < nrow; i++) 
     xarray[i] = new double[ncol]; 

用數值填充它。

然後創建double * xtemparray,它是維度nrow * ncol的向量。

xtemparray = new double [nrow*ncol]; 

把xarray的值放到xtemparray中。

for (i = 0; i < nrow; i++) { 
    for (j = 0; j < ncol; j++) 
     xtemparray[nrow*i + j] = xarray[i][j]; 
} 

聲明矩陣。

MatrixXd xmatrix(nrow, ncol); 

然後,您可以將xtemparray映射到xmatrix。

xmatrix = Map<Matrix<double,Dynamic,Dynamic,RowMajor>>(xtemparray, nrow, ncol); 

到矩陣映射回temparray:

Map<MatrixXd>(xtemparray, xmatrix.rows(), xmatrix.cols()) = xmatrix; 

最後,您可以將xtemparray轉換後xarray。

for (i = 0; i < nrow; i++) { 
    for (j = 0; j < ncol; j++) 
     xpostarray[i][j] = xtemparray[nrow*i + j]; 
}