2013-11-22 2 views
2

В моем последнем вопросе Ilmari Karonen предлагает мне решить Laplace уравнение в режиме дискретности. Я использую сетку и четырех ближайших соседей на каждом узле для вычисления неизвестных высот.Armadillo, как вырастить вектор и получить его размер?

enter image description here

Таким образом, система, чтобы решить можно записать с матрицей:

А (матрица 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

+0

«Карта <>' индексируется по 'паре '? Вы можете прочитать это, чтобы получить некоторые подсказки о том, как сделать эту работу разумно (в частности, пример Якка): http://stackoverflow.com/questions/6684573/floating-point-keys-in-stdmap Если, то есть, вы _really_ хотите индексировать пары поплавков. –

+0

Я вижу, как правило, я использую 'std :: pair ' Я понимаю, что думал в 'int' Я даже писал' + 1' и '-1' вместо' + 1.0f' и '-1.0f' , Спасибо за указание на это. Если нет способа вырастить 'arma :: vec', я буду переписывать это без' std :: map', но я создам структуру для лучшего использования и прочитаю –

+0

Для критического кода производительности такие функции, как std :: vector: : push_back() не очень эффективны. Рано или поздно std :: vector потребуется перераспределить память и скопировать все данные. Лучше всего сначала выработать требуемый размер. – mtall

ответ

1

См. Armadillo's documentation. Например, вы можете использовать X.n_elem, чтобы получить длину вектора X. Чтобы изменить размер вектора при сохранении данных, используйте .resize(). Чтобы добавить строку или столбец в матрицу, используйте .insert_rows() or .insert_cols().

Обратите внимание, что изменение размеров объектов внутри критических циклов производительности (независимо от того, являются ли они матрицами/векторами Armadillo или std :: vector) неэффективно. Намного лучше разработать правильный размер заранее.

+0

Фактически документация хорошо написана, thx –

Смежные вопросы