2017-06-12 22 views
0

我試圖在我的Rcpp代碼中使用nearPD函數。雖然看起來微不足道,但我找不到爲什麼它不起作用。這是我的代碼的簡化版本:當我在R中運行Rcpp cde時出現「不是矩陣」錯誤

#include <RcppArmadillo.h> 
// [[Rcpp::depends(RcppArmadillo)]] 

using namespace arma; 
using namespace Rcpp; 
// [[Rcpp::export]] 
mat eBsc(mat R){ 
    Rcpp::Environment Matrix("package:Matrix"); 
    Rcpp::Function nearPD = Matrix["nearPD"]; 
    Rcpp::List PD=nearPD(R); 
    mat P = PD["mat"]; 
return P; 
    } 

但是,當我想測試它,如下面的R:

A <- matrix(1, 3,3); A[1,3] <- A[3,1] <- 0 
d<-eBsc(A) 

我看到這個錯誤信息:"Error in eBsc(A) : not a matrix"。 我不得不提一下,nearPD返回一個輸出列表,其中第一個是矩陣。

回答

4

你錯了。列表的第一個元素不是矩陣。它是包Matrix中定義的S4對象。此工作原理:

#include <Rcpp.h> 

using namespace Rcpp; 
// [[Rcpp::export]] 
S4 eBsc(NumericMatrix R){ 
    Rcpp::Environment Matrix("package:Matrix"); 
    Rcpp::Function nearPD = Matrix["nearPD"]; 
    Rcpp::List PD=nearPD(R); 
    S4 P = PD["mat"]; 
    return P; 
} 

/*** R 
library(Matrix) 
A <- matrix(1, 3,3); A[1,3] <- A[3,1] <- 0 
eBsc(A) 
    */ 

輸出:

> library(Matrix) 

> A <- matrix(1, 3,3); A[1,3] <- A[3,1] <- 0 

> eBsc(A) 
3 x 3 Matrix of class "dpoMatrix" 
      [,1]  [,2]  [,3] 
[1,] 1.1035534 0.8535534 0.1035534 
[2,] 0.8535534 1.2071068 0.8535534 
[3,] 0.1035534 0.8535534 1.1035534 

PS:如果需要(在RCPP或R)的矩陣使用as.matrix從封裝基座。

PPS:顯然,不用C++代碼調用R函數會更有效率。

+0

非常感謝,它現在有效。 – Ham82

+0

但如果我想在其他一些計算中使用此矩陣,它不起作用。例如,如果我有一個墊子或NumericMatrix A,即使使用「as.matrix」命令,「A * P」也不起作用。有沒有辦法將P(作爲S4對象)轉換爲Rcpp代碼中的合適類型的數據? – Ham82

+0

是的,我解釋瞭如何在我的答案中將其轉換爲矩陣。 – Roland

相關問題