2013-11-22 26 views
2

在我的最後一個問題中,Ilmari Karonen向我求解以離散模式求解Laplace方程。我正在使用網格和每個節點上最近的四個鄰居來計算未知高度。犰狳,如何成長的載體,並得到他的大小?

A(矩陣的n×n)* U(矢量n,未知數)= B(矢量n,解決)

enter image description here

所以解決該系統可與矩陣被寫入

昨天晚上我瀏覽了網絡有關C++的線性代數。我的選擇是Armadillo。但現在「U」和「B」是std::map

std::map<std::pair<float,float>,float> b; 
std::map<std::pair<float,float>,float> U; 
. 
. 
. 
if(g/*grid*/->getNode(r,c)->status == TO_COMPUTE){ 
      U.insert(std::make_pair(std::make_pair(r,c),g->getNode(r,c)->y)); 
      /*right*/ if(g->getNode(r+1,c)->status == SETTLED) b.at(std::make_pair(r,c)) += g >getNode(r+1,c)->y; 
      /*left */ if(g->getNode(r-1,c)->status == SETTLED) b.at(std::make_pair(r,c)) += g->getNode(r-1,c)->y; 
      /*down */ if(g->getNode(r,c+1)->status == SETTLED) b.at(std::make_pair(r,c)) += g->getNode(r,c+1)->y; 
      /*up */ if(g->getNode(r,c-1)->status == SETTLED) b.at(std::make_pair(r,c)) += g->getNode(r,c-1)->y; 
     } 

,我想我會再得到「U」的大小,以創建arma::vec和整個地圖的std::iterator解析轉移值在我arma::vec。所以,我想知道如何種植arma::vec我正在尋找類似std::vector::push_back(),然後我會取代我std::map。另外我怎樣才能得到arma::vec的尺寸?注1:圖中顯示了輪廓和我將計算值的點,當未知值的網格位於y = 0時,當下輪廓位於y = -0.2且上輪廓位於y = 0.8時

注2:當我的小(LINUX)計劃將準備我會發布的代碼在我的到位桶作爲使用離散的拉普拉斯運營商的一個非常小的例子

更新2013年11月26日:

你可以得到的鏈接代碼here

+0

甲'地圖<>''由一對'索引?您可能想閱讀以獲得一些提示,以便如何合理地完成這項工作(特別是Yakk的示例):http://stackoverflow.com/questions/6684573/floating-point-keys-in-stdmap如果,那就是_really_想要通過浮點對來索引。 –

+0

我明白了,通常我使用'std :: pair '我意識到我在'int'的思考,我甚至寫了'+ 1'和'-1'而不是'+ 1.0f'和'-1.0f' 。感謝您指出了這一點。如果沒有辦法生長'arma :: vec',我會在不使用'std :: map'的情況下重寫,但是我會創建一個結構以便更好地使用並閱讀 –

+0

對於性能嚴重的代碼,函數如std :: vector: :push_back()效率不高。遲早std :: vector將需要重新分配內存並複製所有數據。首先計算出所需的大小會更有效率。 – mtall

回答

1

見犰狳的documentation。例如,你可以使用X.n_elem獲得向量X的長度要調整向量同時保留數據,使用.resize()。要將行或列添加到矩陣,請使用.insert_rows() or .insert_cols()

請注意,在性能關鍵循環內調整對象大小(無論它們是犰狳矩陣/矢量還是std :: vector)效率不高。預先制定正確的尺寸要好得多。

+0

其實文檔寫得很好,thx –