2009-04-28 87 views
6

是否有一个单一的表达方式来分配一个标量到升压矩阵或向量的所有元素?我试图找到代表的更紧凑的方式:填充升压矢量或矩阵

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; 
+0

你也应该标记这个 “C++”。 – TonJ 2009-04-28 15:09:49

+0

好点。完成。 – 2009-04-28 15:29:02

回答

7

因为向量建模一个标准的随机存取容器,所以你应该能够使用标准的STL算法。喜欢的东西:

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

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

这可能也与Boost.Assign兼容的,但你必须检查。

0

去过,因为我用C++一段时间。以下工作?

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

这会工作,但它是相对于表达一个完整的声明。 – 2009-04-28 14:51:21

+0

的确如此,但它是更紧凑的方式,这就是你想在帖子中找到的东西。 – 2009-04-28 14:54:40

+0

是的,因此+1。 – 2009-04-28 15:29:44

6

我已经开始使用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()它允许你添加重复的值或值的范围。

1

你试过吗?

的uBLAS :: c_vector V = uBLAS库:: scalar_vector(N,myScalar);

5

推荐的方法是这样的:

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