заполнение вектора или матрицы усиления - PullRequest
7 голосов
/ 28 апреля 2009

Есть ли способ с одним выражением назначить скаляр всем элементам матрицы повышения или вектора? Я пытаюсь найти более компактный способ представления:

boost::numeric::ublas::c_vector<float, N> v;
for (size_t i=0; i<N; i++) {
    v[i] = myScalar;
 }

Следующие не работают:

boost::numeric::ublas::c_vector<float, N> 
   v(myScalar, myScalar, ...and so on..., myScalar);

boost::numeric::ublas::c_vector<float, N> v;
v = myScalar;

Ответы [ 5 ]

7 голосов
/ 28 апреля 2009

Поскольку вектор моделирует стандартный контейнер произвольного доступа, вы должны иметь возможность использовать стандартные алгоритмы STL. Что-то вроде:

c_vector<float,N> vec;
std::fill_n(vec.begin(),N,0.0f);

или

std::fill(vec.begin(),vec.end(),0.0f);

Возможно, он также совместим с Boost.Assign, но вам придется проверить.

6 голосов
/ 29 апреля 2009

Я начал использовать boost::assign для случаев, когда я хочу статически назначить конкретные значения (примеры приведены по ссылке выше).

#include <boost/assign/std/vector.hpp>
using namespace boost::assign; // bring 'operator+()' into scope

{
  vector<int> values;
  values += 1,2,3,4,5,6,7,8,9;
}

Вы также можете использовать boost::assign для карт.

#include <boost/assign/list_inserter.hpp>
#include <string>
using boost::assign;

std::map<std::string, int> months;
insert( months )
        ( "january",   31 )( "february", 28 )
        ( "march",     31 )( "april",    30 )
        ( "may",       31 )( "june",     30 )
        ( "july",      31 )( "august",   31 )
        ( "september", 30 )( "october",  31 )
        ( "november",  30 )( "december", 31 );

Вы можете разрешить делать прямое назначение с list_of() и map_list_of()

#include <boost/assign/list_of.hpp> // for 'list_of()'
#include <list>
#include <stack>
#include <string>
#include <map>
using namespace std;
using namespace boost::assign; // bring 'list_of()' into scope

{
    const list<int> primes = list_of(2)(3)(5)(7)(11);
    const stack<string> names = list_of( "Mr. Foo" )( "Mr. Bar")
                                       ( "Mrs. FooBar" ).to_adapter();

    map<int,int> next = map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);

    // or we can use 'list_of()' by specifying what type
    // the list consists of
    next = list_of< pair<int,int> >(6,7)(7,8)(8,9);

}

Существуют также функции для repeat(), repeat_fun() и range(), которые позволяют добавлять повторяющиеся значения или диапазоны значений.

5 голосов
/ 06 июля 2011

Рекомендуемый способ выглядит следующим образом:

boost::numeric::ublas::c_vector<float, N> v;
v = boost::numeric::ublas::zero_vector<float>(N);
v = boost::numeric::ublas::scalar_vector<float>(N, value);

То же самое для типов матрицы:

boost::numeric::ublas::matrix<float> m(4,4);
m = boost::numeric::ublas::identity_matrix<float>(4,4);
m = boost::numeric::ublas::scalar_matrix<float>(4,4);
m = boost::numeric::ublas::zero_matrix<float>(4,4);
1 голос
/ 16 июня 2010

Вы пробовали это?

ublas :: c_vector v = ublas :: scalar_vector (N, myScalar);

0 голосов
/ 28 апреля 2009

Прошло некоторое время с тех пор, как я использовал C ++. Работает ли следующее?

for (size_t i = 0; i < N; v[i++] = myScalar) ;
...