2013-07-19 1 views
3

나는 Rcpp과 그 기능에 아주 초보자입니다. C++ 그 자체는 말할 것도없고, 아마도 이것은 전문가들에게는 사소한 것처럼 보일 수 있습니다. 그러나 바보 같은 질문은 없습니다. 어쨌든 :C++의 NumericVector에서 여러 값을 추출하는 방법

인덱싱을 사용하여 C++에서 NumericVector의 여러 요소를 처리하는 방법이 있는지 궁금합니다.

# Initial vector 
x <- 1:10 

# Extract the 2nd, 5th and 8th element of the vector 
x[c(2, 5, 8)] 
[1] 2 5 8 

이것은 내가 지금까지 내가 sourceCpp를 사용하여 R에서 실행있어 C++ 기능에있어 무엇 : 모든 것을보다 명확하게하기 위해, 여기에 내가 할 노력하고있어의 R에 해당합니다. 그것은 효과가 있지만, 나에게는 매우 불편한 것처럼 보입니다. 내 목표를 달성하기위한 쉬운 방법이 있습니까?

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
NumericVector subsetNumVec(NumericVector x, IntegerVector index) { 
    // Length of the index vector 
    int n = index.size(); 
    // Initialize output vector 
    NumericVector out(n); 

    // Subtract 1 from index as C++ starts to count at 0 
    index = index - 1; 
    // Loop through index vector and extract values of x at the given positions 
    for (int i = 0; i < n; i++) { 
    out[i] = x[index[i]]; 
    } 

    // Return output 
    return out; 
} 

/*** R 
    subsetNumVec(1:10, c(2, 5, 8)) 
*/ 
> subsetNumVec(1:10, c(2, 5, 8)) 
[1] 2 5 8 

답변

0

더 짧은 길이라고 생각합니다. 이 라인

out[i] = x[index[i]]; 

당신이 범위 검사없이 벡터에 액세스 내

:

하지만 당신의 NumericVector subsetNumVec(NumericVector x, IntegerVector index)는 오류가 발생하기 쉬운입니다. 따라서 간단한 케이스 인 x이 비어 있거나 인덱스가 범위를 벗어나면 정의되지 않은 동작이 발생합니다.

또한, 당신이 방법은 두 벡터를 복사 할 이유가 없다 참조

NumericVector subsetNumVec(const NumericVector& x, const IntegerVector& index) 

에 의해 호출 할 수 있습니다. 당신은 단지 substract를 움직여야 만합니다. out[i] = x.at(index[i] - 1);

여기에서 x.at(index[i] - 1)은 false index를 던집니다. 그런 다음 오류 처리 (빈 벡터 반환 또는 외부 처리)가 필요합니다.

1

Rcpp 벡터가 아닌 Armadillo 벡터를 사용하는 경우이 작업을 수행 할 수 있습니다.

Rcpp Gallerypost with a complete example입니다. 특히 두 번째 예제를 참조하십시오. 색인 생성 항목은 (서명되지 않은) uvec 또는 umat이어야합니다.

관련 문제