在我的最後一個問題中,Ilmari Karonen向我求解以離散模式求解Laplace方程。我正在使用網格和每個節點上最近的四個鄰居來計算未知高度。犰狳,如何成長的載體,並得到他的大小?
A(矩陣的n×n)* U(矢量n,未知數)= B(矢量n,解決)
:所以解決該系統可與矩陣被寫入
昨天晚上我瀏覽了網絡有關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
甲'地圖<>''由一對'索引?您可能想閱讀以獲得一些提示,以便如何合理地完成這項工作(特別是Yakk的示例):http://stackoverflow.com/questions/6684573/floating-point-keys-in-stdmap如果,那就是_really_想要通過浮點對來索引。 –
我明白了,通常我使用'std :: pair'我意識到我在'int'的思考,我甚至寫了'+ 1'和'-1'而不是'+ 1.0f'和'-1.0f' 。感謝您指出了這一點。如果沒有辦法生長'arma :: vec',我會在不使用'std :: map'的情況下重寫,但是我會創建一個結構以便更好地使用並閱讀 –
對於性能嚴重的代碼,函數如std :: vector: :push_back()效率不高。遲早std :: vector將需要重新分配內存並複製所有數據。首先計算出所需的大小會更有效率。 – mtall