2014-09-22 7 views
2

나는 같은 형식의 모든 벡터를 특정 방식으로 결합하고자하는 문제가 있습니다. 내 결과 벡터의 첫 번째 요소를 내 목록의 첫 번째 벡터의 첫 번째 요소로, 두 번째 요소를 두 번째 벡터의 첫 번째 요소로, 세 번째 요소는 세 번째 요소로, 세 번째 요소는 세 번째 요소까지, n은 n까지 내 목록의 길이이고 요소 n + 1이 첫 번째 벡터의 두 번째 요소 여야합니다. 완료 될 때까지 반복됩니다.목록의 벡터 요소를보다 효율적으로 액세스하는 방법은 무엇입니까?

현재,이처럼 일을 오전 : valuesCharacterVectorsList입니다

CharacterVector measure(nrows * expansion); 
CharacterVector temp(nrows); 
for(int i=0; i < measure.size(); i++){ 
    temp = values[i % expansion]; 
    measure[i] = temp[i/expansion]; 
} 
return(measure); 

합니다. 이것은 매우 비효율적이며, 매번 temp을 덮어 쓰지 만, values에있는 요소에 액세스하는 더 좋은 방법을 모른다. C++을 많이 알지는 못하지만 더 나은 방법이 있어야한다고 생각합니다.

모든 도움을 주시면 대단히 감사하겠습니다.

EDIT : values '모든 벡터는 동일한 길이의 nrows하고 values 그것에 expansion 요소를 갖는다.

+1

값이란 무엇입니까? – Ashalynd

+0

우선, 문자 벡터 목록을 수정할 수 있다면 항상 myvector = mylist.front(); 및 mylist.pop_front(); 나중에. 벡터를 사전 구성 할 수 있으며이 벡터의 요소, 즉 벡터 [0], 벡터 [n + 1] 등의 위치를 ​​쉽게 알 수 있습니다. 여기서 n은 mylist.size()입니다. 여기서 목록의 각 벡터는 동일한 크기를 갖는다 고 가정합니다. – cageman

+0

임의 액세스 연산자 목록이 있습니까? –

답변

5

ListOf<CharacterVector> 클래스가 필요합니다. 이름에서 알 수 있듯이 CharacterVector 만 포함 된 R 목록을 나타냅니다.

아래 코드는이를 사용하여 목록에서 각 문자 벡터의 두 번째 요소를 추출합니다. 확장 알고리즘에 맞추기가 어려워서는 안되지만 컨텍스트가 없으면 예제를 재현 할 수 없습니다.

#include <Rcpp.h> 
using namespace Rcpp ; 

// [[Rcpp::export]] 
CharacterVector second(ListOf<CharacterVector> values){ 
    int n = values.size() ; 
    CharacterVector res(n); 
    for(int i=0; i<n; i++){ 
     res[i] = values[i][1] ; 
    } 
    return res ; 
} 
다음

, 당신은 sourceCpp이 일부 샘플 데이터에 그것을 시도 : 귀하의 가정에 대한 지금

> data <- list(letters, letters, LETTERS) 

> second(data) 
[1] "b" "b" "B" 

:

이 보인다 매우 비효율적 덮어 온도 매번

만들기은 꽤 빠르며 데이터의 전체 사본이 없기 때문에 처음에는 문제가되어서는 안됩니다.

+0

우수! 이것은 내가 구문의 관점에서 찾고자했던 것입니다. 덮어 쓰는 임시 직원이 매우 비싼 작업이 아니라는 점에 대해, 내가 "nrows * expansion"대신에 4 번만 그렇게 변경하여 목표 기능의 속도를 3 배로 증가 시켰습니다. 이것은 나에게 상당히 중요하게 보인다. 아마도 효율성 향상을 가져온 변화에 대해 뭔가있는 것이 있었습니까? 또한, 나는 아래 답변 cagemans 대답을 구현하려하지만 그는'CharacterVector &'라인에 컴파일러 오류가있어. 어떤 아이디어? – stanekam

+0

'R'을 위해 한 모든 것에도 감사드립니다! 'Rcpp'와'dplyr' 사이에 큰 영향을주었습니다! 대단히 감사합니다! 러킹 러킹'Rcpp'! – stanekam

+0

4 배로 나는 실제로 확장 시간을 의미합니다. 4 테스트 케이스에서 '확장'의 가치가 있었습니까? – stanekam

1

벡터를 미리 구성 할 수 있으며 첫 번째 벡터의 요소가 어느 위치에 있어야하는지 쉽게 알 수 있습니다. 즉, [0], measure [n], measure [n * 2] 등을 측정 할 수 있습니다. n = mylist .크기(). 여기서 목록의 각 벡터는 동일한 크기를 갖는다 고 가정합니다. 테스트되지 않은 코드 :

+0

각 벡터의 길이는 같습니다. 나는 'measure'에 요소를 삽입하는 것에 대한 수학을 점검 할 것입니다. – stanekam

+0

감사합니다. 코드가 맞다고 생각합니다. 그냥 내 코멘트가 잘못되었습니다 :) 아직 테스트. – cageman

+0

정확히 맞는 것은 아니지만 정확히 일치하는 것입니다. 당신은 빨리'measure'의 크기를 넘는 지수로 끝날 것입니다. '+ = nrows'는'+ = expansion'에 의해 이루어져야합니다. – stanekam

관련 문제