2015-01-13 41 views
0

我有以下問題: 我有幾個部分(本徵)MatrixXds我想連接到另一個更大的MatrixXd變量,我只有一個指針。但是,較小的矩陣和它們的數量都是動態的,所以我不能輕易使用操作符。C++本徵:如何動態連接矩陣(指針問題?)

所以我想下面的(小矩陣存儲在list_subdiagrams,很明顯,和basis->的cols()定義矩陣的數量),採用本徵的MatrixXd塊funtionality:

// sd[] contains the smaller matrices to be concatenated; all are of the same size 
// col defines the total number of smaller matrices 

MatrixXd* ret = new MatrixXd(sd[0]->rows(), col*sd[0]->cols()); 
for (int i=0; i<col; ++i){ 
    ret->block(0, i*sd[0]->cols(), sd[0]->rows(), sd[0]->cols()) = *(sd[i]); 
} 

這不幸的是,似乎以某種方式覆蓋了* ret變量的某些部分 - 在通過塊分配之前,大小(在我的測試用例中)正確顯示爲2×1。分配後它變成了140736006011136x140736006011376 ...

謝謝你的幫忙!

回答

0

你是什麼意思,你不知道大小?您可以使用成員函數cols()/rows()來獲取大小。另外,我假設你是指直接和?在這種情況下,你可以這樣做

#include <iostream> 
#include <Eigen/Dense> 

int main() 
{ 
    Eigen::MatrixXd *A = new Eigen::MatrixXd(2, 2); 
    Eigen::MatrixXd *B = new Eigen::MatrixXd(3, 3); 
    *A << 1, 2, 3, 4; 
    *B << 5, 6, 7, 8, 9, 10, 11, 12, 13; 


    Eigen::MatrixXd *result = new Eigen::MatrixXd(A->rows() + B->rows(), A->cols() + B->cols()); 
    result->Zero(A->rows() + B->rows(), A->cols() + B->cols()); 
    result->block(0, 0, A->rows(), A->cols()) = *A; 
    result->block(A->rows(), A->cols(), B->rows(), B->cols()) = *B; 

    std::cout << *result << std::endl; 

    delete A; 
    delete B; 
    delete result; 
} 

所以首先要確保它適用於2個矩陣,測試它,然後把它擴展到N

+0

謝謝。您的帖子的第一個版本無效 - 不能將矩陣指針直接初始化爲零。然而,這一個是有效的。我會更新我的帖子以更精確。 – cleros

+0

所以 - 我再次查看了不同片段之間的區別,似乎我最初的問題是,我沒有將矩陣初始化爲特定值......因此,顯然使用「new」分配內存是不夠的。你同意這個評估嗎?再次感謝! – cleros

+0

@cleros是的,這是正確的,使用'new'不會初始化矩陣中的任何東西。實際上,即使'MatrixXd mat(2,2);'也不會將元素初始化爲零。你需要明確地初始化矩陣。 – vsoftco