Rcpp矩阵:循环遍历行,一次一列

时间:2011-05-08 23:27:32

标签: r rcpp

这是我第一次尝试使用Rcpp,这个非常简单的问题给了我麻烦。我想使用嵌套for循环来操作矩阵的各个值,一次一列。我的目标是看起来像这样:

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];

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

1 个答案:

答案 0 :(得分:30)

无法在单个[ ]表达式中使用多个索引。这是一个C语言限制没有 C ++矩阵类系统或我所知道的库克服了。所以请改用( )

解决这个以及你实际上没有将src传递给cxxfunction()的错误,我们得到了这个:

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 sugar有一次处理整行或列的示例,请参阅邮件列表存档和插图。

编辑 为了明确,这里只使用一个循环和Rcpp糖的列式索引:< / p>

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>