Pregunta Matriz Rcpp: ciclo sobre filas, una columna a la vez


Esta es la primera vez que pruebo Rcpp y este problema tan simple me causa problemas. Quiero usar ciclos anidados para operar en valores individuales de una matriz, una columna a la vez. El guión que pretendo se vería así:

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))

El resultado deseado sería este:

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

El problema es obviamente en esta línea, donde no sé cómo referirme a los elementos individuales de la matriz.

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

Disculpas si esta es una pregunta estúpida para novatos. ¡Cualquier pista sería apreciada!


20
2018-05-08 23:27


origen


Respuestas:


no poder utilizar múltiples índices en un solo [ ] expresión. Es una restricción de lenguaje C que no Sistema de clase de matriz C ++ o biblioteca Conozco los vencimientos. Entonces usa ( ) en lugar.

Reparar eso y el error que en realidad no pasó src a cxxfunction(), obtenemos esto:

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> 

Por último, tenga en cuenta que el azúcar Rcpp tiene ejemplos para trabajar en una fila o columna completa a la vez, consulte los archivos y la viñeta de la lista de correo.

Editar:


30
2018-05-08 23:44



Preguntas populares