Матрица Rcpp: цикл по строкам, по одному столбцу за раз - PullRequest
20 голосов
/ 09 мая 2011

Я впервые пробую 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 Ответ

30 голосов
/ 09 мая 2011

Вы не можете использовать несколько индексов в одном выражении [ ].Это ограничение языка C, которое преодолевает no 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 по столбцам:

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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...