Матричная индексация через целочисленный вектор - PullRequest
3 голосов
/ 24 июня 2019

Я хочу получить доступ к непоследовательным элементам матрицы, а затем передать подвыбор (например) функции sum ().В приведенном ниже примере я получаю ошибку компиляции о недопустимом преобразовании.Я относительно новичок в Rcpp, поэтому я уверен, что ответ прост.Возможно, мне не хватает какого-то типа приведения?

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::plugins("cpp11")]]

double sumExample() {
    // these are the matrix row elements I want to sum (the column in this example will be fixed)
    IntegerVector a = {2,4,6}; 
    // create 10x10 matrix filled with random numbers [0,1]
    NumericVector v = runif(100);
    NumericMatrix x(10, 10, v.begin()); 
    // sum the row elements 2,4,6 from column 0
    double result = sum( x(a,0) );
    return(result);
}

1 Ответ

3 голосов
/ 24 июня 2019

Вы были близки.Индексирование использует только [] - см. , напишите это в Rcpp Gallery - и вы пропустили тег экспорта.Основная проблема заключается в том, что составное выражение иногда слишком много для компилятора и шаблонного программирования.Так что это работает, если вы разберете это на части.

Исправленный код

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::plugins("cpp11")]]

// [[Rcpp::export]]
double sumExample() {
    // these are the matrix row elements I want to sum
    // (the column in this example will be fixed)
    IntegerVector a = {2,4,6};
    // create 10x10 matrix filled with random numbers [0,1]
    NumericVector v = runif(100);
    NumericMatrix x(10, 10, v.begin());
    // sum the row elements 2,4,6 from column 0
    NumericVector z1 = x.column(0);
    NumericVector z2 = z1[a];
    double result = sum( z2 );
    return(result);
}

/*** R
sumExample()
*/

Демо

 R> Rcpp::sourceCpp("~/git/stackoverflow/56739765/question.cpp")

 R> sumExample()
 [1] 0.758416
 R>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...