犰狳,如何种植矢量并获得他的体型?

时间:2013-11-22 16:11:55

标签: c++ linux linear-algebra armadillo

在我的上一个问题中, Ilmari Karonen 建议我以离散模式解决拉普拉斯方程。我正在使用网格和每个节点上最近的四个邻居来计算未知高度。

enter image description here

因此要解决的系统可以用矩阵编写:

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,当下轮廓在y = -0.2时,上轮廓在y = 0.8 < / p>

note2:当我的小(LINUX)程序准备就绪时,我会在我的bitbucket上发布代码作为使用离散 Laplace 运算符的一个非常小的例子

2013年11月26日更新:

您可以获取代码here

的链接

1 个答案:

答案 0 :(得分:4)

见犰狳的documentation。例如,您可以使用X.n_elem来获取向量X的长度。要在保留数据的同时调整向量大小,请使用.resize()。要向矩阵添加行或列,请使用.insert_rows() or .insert_cols()

请注意,调整性能关键循环内的对象(无论它们是Armadillo矩阵/向量还是std :: vector)都不高效。事先确定正确的尺寸要好得多。