2012-12-08 42 views
11

Tôi làm cách nào để thay đổi kích thước trong Rcpp a NumericVector?Làm thế nào để thay đổi kích thước một NumericVector?

Khi tôi sử dụng chức năng push_back cho điều này, Chương trình sẽ chậm lại. Nhưng không có các hàm .resize() hoặc .reserve(). (Khi tôi đã có một NumericVector với kích thước mong muốn, tôi có thể sử dụng bản sao-constructor để có được kích thước chính xác của NumericVector. Đây là trong trường hợp này nhanh hơn nhiều so với sử dụng push_back)

+0

Như Dirk giải thích, có rất ít cơ hội chúng ta sẽ có một phương pháp 'dự trữ'. Chúng tôi có thể thực hiện một 'thay đổi kích cỡ'. –

Trả lời

17

Nếu bạn thích Thành ngữ C++, sử dụng std::vector<double> và trả về kết quả ở vị trí cuối cùng, nó sẽ được chuyển đổi thông qua một ẩn số wrap() thành một véc tơ R. Bạn cũng có thể sử dụng các vec tơ Armadillo hoặc Eigen thông qua RcppArmadillo và RcppEigen.

Đối tượng của chúng tôi là các trình bao bọc nông xung quanh đối tượng R, do đó, push_back trên, ví dụ: Rcp::NumericVector luôn cần một bản sao đầy đủ. Điều đó được biết và ghi lại.

Edit: Vì vậy, cho đầy đủ, đây là một ví dụ sử dụng RcppArmadillo:

// [[Rcpp::depends(RcppArmadillo)]] 
#include <RcppArmadillo.h> 

// [[Rcpp::export]] 
arma::vec shrink(arma::vec x) { 
    arma::vec y = x; 
    y.resize(y.size()-2); 
    return y; 
} 

mà chúng tôi có thể triển khai qua

R> Rcpp::sourceCpp('/tmp/vec.cpp') 
R> shrink(1:10) 
    [,1] 
[1,] 1 
[2,] 2 
[3,] 3 
[4,] 4 
[5,] 5 
[6,] 6 
[7,] 7 
[8,] 8 
R> 
Các vấn đề liên quan