2009-04-28 36 views
6

Có cách nào để biểu thị một vô hướng cho tất cả các phần tử của ma trận hoặc véc-tơ tăng không? Tôi đang cố gắng để tìm một cách nhỏ gọn hơn của đại diện:điền vào một vector tăng hoặc ma trận

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

Sau đây không làm việc:

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

Bạn cũng nên thẻ này "C++". – TonJ

+0

Điểm tốt. Làm xong. –

Trả lời

7

Vì mô hình vector là vùng chứa truy cập ngẫu nhiên chuẩn nên bạn có thể sử dụng thuật toán STL tiêu chuẩn. Một cái gì đó như:

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

hoặc

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

Nó có lẽ cũng tương thích với Boost.Assign nhưng bạn sẽ phải kiểm tra.

+0

Thuật toán STL dường như hoạt động. Cảm ơn. Boost.Assign dường như không làm việc cho tôi, nhưng tôi nghĩ rằng đó là bởi vì tôi đang sử dụng một c_vector (const-sized vector) thay vì một vector (động có kích thước vector), vì vậy push_back không hoạt động. –

+0

Điều này không trả lời làm thế nào bạn sẽ điền vào một 'tăng :: số :: ublas :: ma trận ' – arman

0

Được một lúc kể từ khi tôi sử dụng C++. Công việc sau đây có phải không?

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

Điều đó sẽ hoạt động, mặc dù nó là một tuyên bố đầy đủ như trái ngược với một biểu thức. –

+0

Đúng, nhưng đó là cách nhỏ gọn hơn là những gì bạn muốn tìm dựa trên bài đăng. –

+0

Có, do đó +1. –

6

Tôi đã bắt đầu sử dụng boost::assign cho các trường hợp tôi muốn chỉ định tĩnh giá trị cụ thể (ví dụ được gỡ bỏ từ liên kết ở trên).

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

Bạn cũng có thể sử dụng boost::assign cho bản đồ.

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

Bạn có thể cho phép làm nhiệm vụ trực tiếp với 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); 

} 

Ngoài ra còn có chức năng cho repeat(), repeat_fun(), và range() cho phép bạn thêm các giá trị lặp đi lặp lại hoặc dãy các giá trị.

+1

Ví dụ đầu tiên có vẻ là cho std :: vector (mà nó hoạt động), không tăng :: số :: ublas :: vectơ (mà nó không hoạt động). –

1

Bạn đã thử cái này chưa?

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

5

Cách khuyến cáo trông như thế này:

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

Điều này cũng với nhiều loại ma trận:

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

Làm cách nào để nhận ra loại giá trị nếu tôi không biết? –

Các vấn đề liên quan