2011-08-15 2 views
2

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

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

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

+1

Это уточнение синтаксиса вектора экспрессии, так что до сих пор поддерживает 'начать()', 'конец() 'и т. д. Вы все равно можете использовать стандартные алгоритмы. http://www.boost.org/doc/libs/1_47_0/libs/numeric/ublas/doc/expression_concept.htm#vector_expression – Schnommus

ответ

1

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

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

Ближайший эквивалент карта является 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() или аналогичный)

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