Filling a vector or acceleration matrix

Is there a single expression way to assign a scalar to all elements of a matrix or a boost vector? I am trying to find a more compact way of representing:

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

The following steps do not work:

 boost::numeric::ublas::c_vector<float, N> v(myScalar, myScalar, ...and so on..., myScalar); boost::numeric::ublas::c_vector<float, N> v; v = myScalar; 
+6
c ++ boost expression ublas
source share
5 answers

Since vector models represent a standard random access container, you should be able to use standard STL algorithms. Something like:

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

or

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

It may also be compatible with Boost.Assign, but you will need to check.

+7
source share

I started using boost::assign for cases when I want to statically assign specific values ​​(examples removed from the link above).

 #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; } 

You can also use boost::assign for maps.

 #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 ); 

You can enable direct assignment with list_of() and 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); } 

There are also functions for repeat() , repeat_fun() and range() that allow you to add duplicate values ​​or ranges of values.

+6
source share

The recommended method is as follows:

 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); 

The same applies to matrix types:

 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); 
+5
source share

Have you tried this?

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

+1
source share

It has been some time since I used C ++. Is the following being done?

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

All Articles