簡體   English   中英

將std :: vector轉換為Rcpp矩陣

[英]Convert std::vector to Rcpp matrix

這是一個與Rcpp轉換相關的Q.我正在尋找將長std :: vector轉換為Rcpp矩陣對象,但想知道是否有一個簡單的轉換格式。 當然,你可以遍歷每個元素並填充一個空的Rcpp矩陣,但這似乎容易出錯,如果可以采用更方便的方法,則可能是不必要的。

我問的原因是我想在一些現有的C ++代碼中使用OpenMP,但是直接在OpenMP循環中將元素存儲在Rcpp矩陣對象中似乎不能正常工作(而加載std :: vector對象並轉換在OpenMP循環完成后到矩陣似乎是解決問題的一個不錯的方法)。

任何幫助將不勝感激!

擴展Dirk的答案; R矩陣實際上只是具有dim屬性集的向量

> x <- 1
> y <- as.matrix(x)
> .Internal( inspect(x) )
@7f81a6c80568 14 REALSXP g0c1 [MARK,NAM(2)] (len=1, tl=0) 1 ## data
> .Internal( inspect(y) )
@7f81a3ea86c8 14 REALSXP g0c1 [NAM(2),ATT] (len=1, tl=0) 1 ## data
ATTRIB:
  @7f81a3e68e08 02 LISTSXP g0c0 [] 
    TAG: @7f81a30013f8 01 SYMSXP g1c0 [MARK,LCK,gp=0x4000] "dim" (has value) 
    @7f81a3ea8668 13 INTSXP g0c1 [NAM(2)] (len=2, tl=0) 1,1

注意xy的'data'組件是如何只是REALSXP ,但你在矩陣上有這個額外的dim組件。 利用這一點,我們可以將很容易地轉換NumericVector在矩陣Rcpp

(注意:在下面的示例中,我在屬性中使用SEXP ,因此類型之間的轉換是顯式的):

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
SEXP vec_to_mat(SEXP x_) {
  std::vector<double> x = as< std::vector<double> >(x_);
  /* ... do something with x ... */
  NumericVector output = wrap(x);
  output.attr("dim") = Dimension(x.size(), 1);
  return output;
}

/*** R
m <- c(1, 2, 3)
vec_to_mat(m)
*/

給我

> m <- c(1, 2, 3)

> vec_to_mat(m)
     [,1]
[1,]    1
[2,]    2
[3,]    3

因此,您可以使用Dimension類並將其分配給向量的dim屬性,以在Rcpp中“手動”生成矩陣。

你選擇了一個好的方法。 在OpenMP上下文中,你必須遠離單線程R.所以std::vector很好。

是的,我們有從std::vectorRcpp::NumericVectorRcpp::NumericMatrix (畢竟只是一個帶有維度屬性的向量)的Rcoo:Integer*以及Rcoo:Integer*變體,以及通常as<>wrap轉換器。

Rcpp單元測試,Rcpp示例以及Rcpp Gallery站點上應該有大量示例。

編輯:這是一個非常簡單的例子:

 R> cppFunction('NumericVector phil(int n) { std::vector<double> x(n);
 +              return wrap(x); }') 
 R> phil(4)  
 [1] 0 0 0 0    
 R>    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM