2016-09-29 44 views
1

當與其他語言接口時,R使用包含類型Rcomplex的標頭R_ext/Complex.h,其似乎是std::complex<double>的實現。使用它的標準方式將是一個複雜的向量x_RRcomplex *px = COMPLEX(x_); 然而,因爲我需要它傳遞給armadillo然後我做的: arma::cx_vec x(px, nrows(x_), false, false);將R複雜對象傳遞給犰狳C++

armadillo不接受Rcomplex類型。我曾嘗試這樣做,而不是: std::complex<double> *px = COMPLEX(x_); 但得到以下error: cannot convert ‘Rcomplex*’ to ‘std::complex<double>*’ in initialization

你有R中經過複雜的矢量std::complex<double> type任何線索?我知道Rcpp但想有一個直接的解決方案依託基地R.

編輯:下面一個評論,我想澄清的是RcomplexC類型,但它根據與std::complex<double>兼容answer by @Stephen Canon。

編輯2:爲什麼德克的回答比接受的答案有更多的投票,如果它不回答「沒有依賴」的問題。另外,我顯然已經被低估了,因爲如果最好是用C或C++來使用base R,有人不喜歡它。無論如何,我有更好的事情要做,但這不是我第一次在提出某些與基準R與C或C++接口相關的問題時得不到我原來的問題的答案,並且得到了一個我沒有要求的相關答案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

複數是在不太常見統計數據並不是最初的重點。不過也有使用情況巴蒂斯特有onetwo包其推到功能添加到給定的犰狳和R.現有的支持

因此,所有的工作是爲你做的模板界面 - 在這裏是最簡單的例子可能經過復值矩陣並返回其總和:

#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) 
*/ 

它你所期望:

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通過他們dillo轉到Armadillo,然後讓他們回到R.沒有編寫額外的代碼行,也沒有可識別的開銷。