Передача матриц по ссылке в Rcpp - PullRequest
0 голосов
/ 25 июня 2018

Я работал над передачей R-матриц в функции C ++ с использованием Rcpp и заметил несколько интересных действий: объект типа NumericMatrix передается по ссылке, а объект типа IntegerMatrix - по значению.

Например, следующая функция изменяет запись первой строки и столбца матрицы на 5:

//[[Rcpp::export]]
void modify_matrix(NumericMatrix x
{
  x(0,0) = 5;
}

Однако, когда я изменяю функцию на

//[[Rcpp::export]]
void modify_matrix(IntegerMatrix x)
{
  x(0,0) = 5;
}

или

//[[Rcpp::export]]
void modify_matrix(IntegerMatrix& x)
{
  x(0,0) = 5;
}

функция ничего не делает.Кто-нибудь знает, почему это так?

1 Ответ

0 голосов
/ 25 июня 2018

Конечно, это работает тогда и только тогда, когда вы передаете матричные целые числа :

R> Rcpp::sourceCpp("/tmp/so51028610.cpp")

R> M <- matrix(1L, 2, 2)   # integer type

R> M                       # all ones
     [,1] [,2]
[1,]    1    1
[2,]    1    1

R> modify_matrix(M)        # call to mod

R> M                       # and changed
     [,1] [,2]
[1,]    5    1
[2,]    1    1
R> 

, где ваш (минимально модифицированный) код плюс вызов R равны

#include <Rcpp.h>

// [[Rcpp::export]]
void modify_matrix(Rcpp::IntegerMatrix x) {
  x(0,0) = 5;
}

/*** R 
M <- matrix(1L, 2, 2)   # integer type
M                       # all ones
modify_matrix(M)        # call to mod
M                       # and changed
*/

C и C ++ являются статически типизированными языками.Вы должны беспокоиться об этом больше, чем в R.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...