2017-06-12 3 views
0

RcppコードにnearPD関数を使用しようとしています。それは些細なようだが、なぜそれが動作しないのか分からない。これは私のコードの簡略化されたバージョンです:Rcpp cdeをRで実行すると「マトリックスではありません」というエラーが発生する

#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:あなたは(R Rcpp中または中)、パッケージベースから行列使用as.matrixが必要な場合。

PPS:明らかに、C++コードでR関数を呼び出さない方が効率的です。

+0

ありがとう、それは今動作します。 – Ham82

+0

しかし、この行列を他の計算で使用したいのであれば、それは動作しません。たとえば、マットやNumericMatrix Aを使用している場合、 "as.matrix"コマンドを使用しても大文字小文字の "A * P"は機能しません。 P(S4オブジェクトとして)をRcppコード内の適切なタイプのデータに変換する方法はありますか? – Ham82

+0

はい、答えのマトリックスに変換する方法を説明します。 – Roland

関連する問題