c-犰狳,如何长成一个向量并得到他的大小?
作者:互联网
在我的最后一个问题中,Ilmari Karonen向我建议以离散模式求解拉普拉斯方程.我正在使用一个网格和每个节点上四个最近的邻居来计算未知高度.
因此要解决的系统可以用矩阵写:
A(矩阵nxn)* 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.2,上轮廓为y = 0.8时,具有未知值的网格为y = 0
note2:当我的小程序(LINUX)准备就绪时,我将在我的存储桶中释放代码,这是使用离散Laplace运算符的一个非常小的示例
2013年11月26日更新:
您可以获取到代码here的链接
解决方法:
请参阅Armadillo的documentation.例如,您可以使用X.n_elem获取向量X的长度.要在保留数据的同时调整向量的大小,请使用.resize().要向矩阵中添加行或列,请使用.insert_rows() or .insert_cols().
请注意,在性能关键循环内调整对象(无论它们是Armadillo矩阵/矢量还是std :: vector)的大小都不有效.事先确定正确的大小要好得多.
标签:linear-algebra,armadillo,linux,c-4 来源: https://codeday.me/bug/20191030/1965803.html