2016-09-29 4 views
1

R은 다른 언어와 인터페이스 할 때 을 포함하는 헤더를 사용합니다. 이는 std::complex<double>의 구현 인 것으로 보입니다. 그것을 사용하는 표준 방법은 R에 복잡한 벡터 x_이 될 것이다 : 그러나 Rcomplex *px = COMPLEX(x_); , 내가 그때 할 armadillo에 전달해야하기 때문에 : arma::cx_vec x(px, nrows(x_), false, false);R 복합 객체를 armadillo에 전달 C

하지만 armadilloRcomplex 유형을 허용하지 않습니다. std::complex<double> *px = COMPLEX(x_); 을하지만, 얻을 다음 error: cannot convert ‘Rcomplex*’ to ‘std::complex<double>*’ in initialization

당신이 std::complex<double> type에 R에 복잡한 벡터를 전달하는 단서가 있습니까 : 나는 시도를 대신하고있다? 나는 Rcpp의 알고 있지만

편집 기본 R.에 의존 직접 해결하고 싶은 : 코멘트 중 하나를 따라, 나는 RcomplexC 유형임을 명확히하고 싶었을하지만에 따라 std::complex<double>와 호환되는지 @Stephen Canon의 answer

EDIT2 : "종속성 없음"질문에 답변하지 않는 경우 Dirk의 답변에 승인 된 답변보다 더 많은 투표가있는 이유는 무엇입니까? 또한 C 나 C++로 기본 R을 사용하기를 원한다면 누군가가 선호하지 않기 때문에 나는 분명히 downvoted되었습니다. 어쨌든, 더 좋은 일이 있지만 C 또는 C++와의 기본 R 관련 인터페이스를 묻고 내가 묻지 않은 Rcpp 관련 대답을 얻으 려 할 때 원래 질문에 대한 답변을 얻지 못한 것은 처음이 아닙니다.

+0

RcppArmadillo를 사용하지 않는 특별한 이유가 있습니까? – Roland

+0

@Roland 간단한 일을 위해 나는 보통 의존성을 피하는 것을 선호하며 제 기능은 매우 쉽지만 속도를 높이고 싶습니다. – nopeva

+0

@nopeva : 그것은 바퀴의 재발 명이라고합니다. 같은 논리로 당신은 아르마딜로를 사용하지 않을 것입니다. 또는 R. –

답변

1

reinterpret_cast을 사용하면 항상 한 유형을 다른 유형으로 강제 설정할 수 있습니다. 일반적으로 이것은 나쁜 생각,하지만 당신은이 개 복잡한 유형이 실제로 호환을 보장 할 수 있다면, 당신은 할 수 있습니다 :

Rcomplex* px = COMPLEX(x_); 
arma::cx_vec x(reinterpret_cast<arma::cx_double*>(px), nrows(x_), false, false); 

유형 arma::cx_doubleshorthandstd::complex<double>에 대한

4

복소수가 덜 일반적인이다 통계는 초기 초점이 아니 었습니다. 그러나 Baptiste에는 one 또는 two 패키지가 있습니다. Armadillo 및 R에서 기존 지원이 제공되는 인터페이스에 기능을 추가하기 위해 푸시됩니다.

모든 작업이 템플릿에서 완료되었습니다. 여기에 가장 간단한 예가있을 수 있습니다. 의 합을 복합 값 행렬을 전달하고 반환하는 :

R> sourceCpp("/tmp/armaComplex.cpp") 

R> C <- matrix((1+1i) * 1:4, 2, 2) 

R> C 
    [,1] [,2] 
[1,] 1+1i 3+3i 
[2,] 2+2i 4+4i 

R> foo(C) 
    [,1] [,2] 
[1,] 2+2i 6+6i 
[2,] 4+4i 8+8i 
R> 

그래서 우리는 R 복잡한 값으로 시작 Rcpp 및 RcppArma를 통해 전달할 :

#include <RcppArmadillo.h> 

// [[Rcpp::depends(RcppArmadillo)]] 

// [[Rcpp::export]] 
arma::cx_mat foo(const arma::cx_mat & C) { 
    return C + C; 
} 

/*** R 
C <- matrix((1+1i) * 1:4, 2, 2) 
C 
foo(C) 
*/ 

그것은 당신이 기대하는 일 dillo를 Armadillo에 가져 가서 다시 R로 가져 가야합니다. 추가 코드 줄을 쓰지 않고 식별 할 수있는 오버 헤드가 없습니다.