2015-07-28 62 views
1

我已經編寫了一個Rcpp代碼來計算R中元素明智的矩陣乘法。但是當試圖運行此代碼時R停止工作並退出。如何糾正這個功能?如何在R中編寫用於簡單矩陣乘法的Rcpp函數

在此先感謝。

library(Rcpp) 
func <- 'NumericMatrix mmult(NumericMatrix m , NumericMatrix v, bool byrow=true) 
{ 
if(! m.nrow() == v.nrow()) stop("Non-conformable arrays") ; 
if(! m.ncol() == v.ncol()) stop("Non-conformable arrays") ; 

NumericMatrix out(m) ; 

for (int i = 1; i <= m.nrow(); i++) 
{ 
    for (int j = 1; j <= m.ncol(); j++) 
    { 
     out(i,j)=m(i,j) * v(i,j) ; 
    } 
} 
return out ; 
}' 

cppFunction(func) 

m1<-matrix(1:4,2,2) 
m2<-m1 
r1<-mmult(m1,m2) 
r2<-m1*m2 
+0

用你的例子,它運行,但'r1'和'r2'是不同的。 – 2015-07-28 08:28:58

+0

我想讓我的r1輸出爲r2。如何用我的代碼做到這一點? – kondal

+0

我不知道。您的功能適用於您的示例,無需退出。修改你的功能。 – 2015-07-28 08:32:53

回答

3

的(至少對我來說)明顯選擇是用RcppArmadillo:

R> cppFunction("arma::mat matmult(arma::mat A, arma::mat B) { return A % B; }", 
+    depends="RcppArmadillo") 
R> m1 <- m2 <- matrix(1:4,2,2) 
R> matmult(m1,m2) 
    [,1] [,2] 
[1,] 1 9 
[2,] 4 16 
R> 

如犰狳是強類型,並具有元件逐元素乘法運算符(%)這是我們在一行程序需要使用。

4

你必須記住,使用0索引數組。 (見Why does the indexing start with zero in 'C'?Why are zero-based arrays the norm?

所以,你需要定義你的循環,從0運行m.nrow() - 1

試試這個:

func <- ' 
NumericMatrix mmult(NumericMatrix m , NumericMatrix v, bool byrow=true) 
{ 
    if(! m.nrow() == v.nrow()) stop("Non-conformable arrays") ; 
    if(! m.ncol() == v.ncol()) stop("Non-conformable arrays") ; 

    NumericMatrix out(m) ; 

    for (int i = 0; i < m.nrow(); i++) 
    { 
    for (int j = 0; j < m.ncol(); j++) 
    { 
    out(i,j)=m(i,j) * v(i,j) ; 
    } 
    } 
    return out ; 
    } 
' 

然後我得到:

> mmult(m1,m2) 
    [,1] [,2] 
[1,] 1 9 
[2,] 4 16 

> m1*m2 
    [,1] [,2] 
[1,] 1 9 
[2,] 4 16