犰狳,如何增长一个向量并获得他的大小?
Posted
技术标签:
【中文标题】犰狳,如何增长一个向量并获得他的大小?【英文标题】:Armadillo, how to grow a vector and get his size? 【发布时间】:2013-11-22 16:11:55 【问题描述】:在我的最后一个问题中,Ilmari Karonen 建议我以离散模式求解 Laplace 方程。我使用网格和每个节点的四个最近邻居来计算未知高度。
所以求解的系统可以写成矩阵:
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
的大小?
note1:图片显示了轮廓和我将计算值的点,未知值的网格在 y=0,当下轮廓在 y=-0.2 和上轮廓在 y=0.8
note2 : 当我的小 (LINUX) 程序准备就绪时,我将在我的 bitbucket 上发布代码,作为使用离散 Laplace 运算符的一个非常小的示例
2013 年 11 月 26 日更新:
你可以得到代码here的链接
【问题讨论】:
由pair<float,float>
索引的map<>
?您可能想阅读本文以获取一些提示,以了解如何合理地使其工作(尤其是 Yakk 的示例):***.com/questions/6684573/… 如果,也就是说,您真的想要按浮点数对进行索引。
我明白了,通常我使用std::pair<int,int>
我意识到我在考虑int
我什至写了+1
和-1
而不是+1.0f
和-1.0f
。感谢您指出了这一点。如果没有办法增加arma::vec
,我会在没有std::map
的情况下重写它,但我会创建一个结构以便更好地使用和阅读
对于性能关键代码,像 std::vector::push_back() 这样的函数效率不是很高。迟早 std::vector 将需要重新分配内存并复制所有数据。首先计算出所需的尺寸会更有效。
【参考方案1】:
参见犰狳的documentation。例如,您可以使用X.n_elem 来获取向量X 的长度。要在保留数据的同时调整向量的大小,请使用.resize()。要向矩阵添加行或列,请使用.insert_rows() or .insert_cols()。
请注意,在性能关键循环内调整对象的大小(无论它们是 Armadillo 矩阵/向量还是 std::vector)效率不高。最好事先计算出正确的尺寸。
【讨论】:
以上是关于犰狳,如何增长一个向量并获得他的大小?的主要内容,如果未能解决你的问题,请参考以下文章