Выполнение STL-операций над векторами Boost :: uBLAS - PullRequest
2 голосов
/ 15 августа 2011

Как я могу сопоставить функцию каждому элементу вектора в uBLAS (например, Map [] в Mathematica)?

Например; Я хочу взять sin() всех элементов вектора uBLAS. Есть ли в Boost, GSL или любых других числовых библиотеках оптимизированный способ сделать это вместо простого обхода элементов вектора?

Кроме того, как бы я выполнял другие расширенные операции с векторами uBLAS, такие как вращение, удаление дубликатов или заполнение нулями и т. Д.?

Ответы [ 2 ]

1 голос
/ 15 августа 2011

Ваш вектор (согласно this ) поддерживает нормальные векторные операции, просто используйте стандартные алгоритмы.В вашем случае, вот несколько справок (все внутри <algorithm>):

  • Для операции синуса используйте std::transform с sinef из <cmath>
  • Для вращения (я предполагаю векторное вращение, а не угловое вращение) std::rotate.
  • Удаление дубликатов, используйте std::unique после сортировки, удаляя неиспользуемые элементы.
  • Заполнение нулямиэто скорее выходная операция - вы не выполняете это для вектора
1 голос
/ 15 августа 2011

Ближайшим эквивалентом карты является std::transform

#include <algorithm>
#include <functional>
#include <vector>
#include <cmath>

int main() {
   std::vector<float> values;
   values.push_back(0.5f);
   values.push_back(1.0f);
   std::transform(values.begin(), values.end(), values.begin(), std::ptr_fun(sinf));
}

А для дедупликации:

#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>

int main() {
   std::vector<int> duplicates;
   duplicates.push_back(1);
   duplicates.push_back(3);
   duplicates.push_back(5);
   duplicates.push_back(1);
   std::sort(duplicates.begin(), duplicates.end());
   duplicates.erase(std::unique(duplicates.begin(), duplicates.end()), duplicates.end());
   std::copy(duplicates.begin(), duplicates.end(), std::ostream_iterator<int>(std::cout, "\n"));
}

(я думаю, у вектора ublas begin() и end() или аналогичные)

...