В моем последнем вопросе Ilmari Karonen предлагает мне решить Laplace уравнение в режиме дискретности. Я использую сетку и четырех ближайших соседей на каждом узле для вычисления неизвестных высот.Armadillo, как вырастить вектор и получить его размер?
Таким образом, система, чтобы решить можно записать с матрицей:
А (матрица NxN) * U (вектор п, неизвестные) = Ь (вектор п, решен)
прошлым вечером я огляделся по Сети о линейной алгебре для C++. Мой выбор Armadillo. Но сейчас «U» и «б» являются 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) будет готова отпущу код на моем BitBucket как очень крошечный пример использования Discret Лапласа оператора
Update 26 Ноябрь 2013:
вы можете получить ссылку на код here
«Карта <>' индексируется по 'паре'? Вы можете прочитать это, чтобы получить некоторые подсказки о том, как сделать эту работу разумно (в частности, пример Якка): 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