在我的最后一个问题中,Ilmari Karonen 建议我在离散模式下求解 Laplace 方程。我在每个节点使用网格和四个最近的邻居来计算未知高度。
所以要求解的系统可以写成矩阵:
A(矩阵 nxn)* U( vector n,未知数)= b( vector 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
解析整个 map 传输我的 arma::vec
中的值。所以我想知道如何培养 arma::vec
我正在寻找类似 std::vector::push_back()
的东西,然后我将替换我的std::map
。另外,如何获取 arma::vec
的大小?
注意 1:图片显示了轮廓和我将计算值的点,未知值的网格在 y=0,当下轮廓在 y=-0.2 和上轮廓在 y=0.8
注意 2:当我的小 (LINUX) 程序准备就绪时,我将在我的 bitbucket 上发布代码,作为使用离散 Laplace 运算符的一个非常小的例子
2013 年 11 月 26 日更新:
您可以获得代码的链接 here
最佳答案
查看 Armadillo 的 documentation .例如,您可以使用 X.n_elem获取 vector X 的长度。要在保留数据的同时调整 vector 的大小,请使用 .resize() .要向矩阵添加行或列,请使用 .insert_rows() or .insert_cols() .
请注意,在性能关键循环(无论是 Armadillo 矩阵/vector 还是 std::vector)中调整对象的大小效率不高。最好事先计算出正确的尺寸。
关于c++ - Armadillo ,如何增长 vector 并获得他的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20149427/