2011-11-13 86 views
5

Tôi có một phương thức lấy một vector :: std là một trong các tham số của nó. Có cách nào tôi có thể khởi tạo một ma trận bằng cách gán std :: vector cho ma trận? Đây là những gì tôi đã cố gắng làm dưới đây. Có ai biết làm thế nào tôi có thể đạt được chỉ định các vector (hoặc thậm chí là một con trỏ của đôi) để ma trận? Cảm ơn trước. MikeKhởi tạo ma trận tăng với std :: vector hoặc array

void Foo(std::vector v) 
{ 
    matrix<double> m(m, n, v); 
    // work with matrix... 
} 
+1

Một ma trận là một cấu trúc hai chiều, một vectơ là một trong những cấu trúc chiều. Làm thế nào để bạn có kế hoạch để xác định kích thước chính xác cho ma trận bằng cách kiểm tra các vector? – Mankarse

Trả lời

3

Theo boost matrix documentation, có 3 nhà xây dựng cho lớp ma trận: trống, sao chép, và một dùng hai size_types cho số hàng và cột. Vì boost không định nghĩa nó (có lẽ bởi vì có nhiều cách để làm điều đó và không phải mọi lớp là cồng để định nghĩa một chuyển đổi thành mọi lớp khác), bạn sẽ cần xác định chuyển đổi. Đây là một cách tiếp cận mà tôi sẽ sử dụng, nhưng vì có nhiều cách để làm điều này và câu hỏi không chỉ rõ cách bạn muốn thực hiện điều này, bạn có thể tìm thấy một cách tiếp cận khác phù hợp hơn với tình huống của bạn.

void Foo(const std::vector<double> & v) { 
    size_t m = ... // you need to specify 
    size_t n = ... // you need to specify 

    if(v.size() < m * n) { // the vector size has to be bigger or equal than m * n 
     // handle this situation 
    } 

    matrix<double> mat(m, n); 
    for(size_t i=0; i<mat.size1(); i++) { 
     for(size_t j=0; j<mat.size2(); j++) { 
     mat(i,j) = v[i+j*mat.size1()]; 
     } 
    } 
} 

Một vài ghi chú về mã được cung cấp của bạn: std :: vector cần có một lập luận templated và bạn đang tuyên bố m như một ma trận và một cuộc tranh cãi đầu vào để xây dựng nó.

3

Dưới đây là một ví dụ về cách thức này có thể được thực hiện:

#include <algorithm> 
#include <vector> 
#include <boost/numeric/ublas/storage.hpp> 
#include <boost/numeric/ublas/matrix.hpp> 
#include <boost/numeric/ublas/io.hpp> 

namespace ublas = boost::numeric::ublas; 

template <typename T, typename F=ublas::row_major> 
ublas::matrix<T, F> makeMatrix(std::size_t m, std::size_t n, const std::vector<T> & v) 
{ 
    if(m*n!=v.size()) { 
     ; // Handle this case 
    } 
    ublas::unbounded_array<T> storage(m*n); 
    std::copy(v.begin(), v.end(), storage.begin()); 
    return ublas::matrix<T>(m, n, storage); 
} 

int main() {; 
    std::vector<double> vec {1, 2, 3, 4, 5, 6}; 
    ublas::matrix<double> mm = makeMatrix(3,2,vec); 
    std::cout << mm << std::endl; 
} 
1

Một cách thuận tiện hơn là như thế này:

matrix<double> m(m*n); 
std::copy(v.begin(), v.end(), m.data().begin()); 
Các vấn đề liên quan