2011-05-08 46 views
20

这是我第一次尝试Rcpp,这个非常简单的问题给我带来了麻烦。我想使用嵌套for循环来操作矩阵的单个值,每次一列。我的目标该脚本会是这个样子:Rcpp矩阵:循环遍历行,一次一列

src <- ' 
    Rcpp::NumericMatrix Am(A); 
    int nrows = Am.nrow(); 
    int ncolumns = Am.ncol(); 
    for (int i = 0; i < ncolumns; i++){ 
     for (int j = 1; j < nrows; j++){ 
      Am[j,i] = Am[j,i] + Am[j-1,i]; 
     } 
    } 
    return Am; 
' 
fun <- cxxfunction(signature(A = "numeric"), body = src, plugin="Rcpp") 
fun(matrix(1,4,4)) 

所需的输出会是这样:

 [,1] [,2] [,3] [,4] 
[1,] 1 1 1 1 
[2,] 2 2 2 2 
[3,] 3 3 3 3 
[4,] 4 4 4 4 

的问题显然是在这条线,在这里我就不知道怎么指的是矩阵的单个元素。

Am[j,i] = Am[j,i] + Am[j-1,i]; 

道歉,如果这是一个愚蠢的新手问题。任何提示将不胜感激!

+2

我以前说过的话,我会说它又一次:'rcpp-devel'是解决这些问题的好地方。 – 2011-05-08 23:36:27

+0

@DirkEddelbuettel虽然我明白'rcpp-devel'列表可能会更多地接触到使用'rcpp'的人,在我看来,stackoverflow更容易访问。 – jbaums 2012-08-17 00:03:18

+0

@jbaums:当然,但所有关键的rcpp-devel贡献者只有一个在这里看到问题。减少问题的眼球... – 2012-08-17 00:46:35

回答

30

不能在单个[ ]表达式中使用多个索引。这是一个C语言的限制,我知道克服的C++矩阵类系统或库。因此改用()

修复这一点,你实际上并没有通过srccxxfunction()的错误,我们得到这样的:

R> src <- ' 
+  Rcpp::NumericMatrix Am(A); 
+  int nrows = Am.nrow(); 
+  int ncolumns = Am.ncol(); 
+  for (int i = 0; i < ncolumns; i++) { 
+   for (int j = 1; j < nrows; j++) { 
+    Am(j,i) = Am(j,i) + Am(j-1,i); 
+   } 
+  } 
+  return Am; 
+ ' 
R> fun <- cxxfunction(signature(A = "numeric"), body = src, plugin="Rcpp") 
R> fun(matrix(1,4,4)) 
    [,1] [,2] [,3] [,4] 
[1,] 1 1 1 1 
[2,] 2 2 2 2 
[3,] 3 3 3 3 
[4,] 4 4 4 4 
R> 

最后,注意RCPP糖有例子在时间上整行或列的工作,看邮件列表档案和小插曲。

编辑:只要是明确的,这里只使用一个循环和RCPP糖列Wise索引相同:

R> src <- ' 
+  Rcpp::NumericMatrix Am(A); 
+  int nrows = Am.nrow(); 
+  for (int j = 1; j < nrows; j++) { 
+   Am(j,_) = Am(j,_) + Am(j-1,_); 
+  } 
+  return Am; 
+ ' 
R> fun <- cxxfunction(signature(A = "numeric"), body = src, plugin="Rcpp") 
R> fun(matrix(1,4,4)) 
    [,1] [,2] [,3] [,4] 
[1,] 1 1 1 1 
[2,] 2 2 2 2 
[3,] 3 3 3 3 
[4,] 4 4 4 4 
R> 
+3

美丽!感谢Dirk的回应。我将把未来的问题(如果有的话)引导到Rcpp-devel列表。再次感谢! – Vincent 2011-05-08 23:48:46

+4

而不是'Am(j,_)'你可以使用'Am.row(j)'。 – 2016-05-13 19:02:29