Извлечение строк матрицы в Rcpp - PullRequest
2 голосов
/ 11 февраля 2020

Я следую R cpp Краткое справочное руководство , чтобы извлечь строку матрицы как вектор. Пример руководства:

// Copy the second column into new object (xx is a NumericMatrix)
NumericVector zz1 = xx( _, 1);

Когда я получаю следующий код в Rstudio, я получаю следующую ошибку:

enter image description here

#include <Rcpp.h>
using namespace Rcpp;


// [[Rcpp::export]]
int foo1(Rcpp::IntegerVector res)
{
  int output = res[0];
  return output;
}


// [[Rcpp::export]]
int foo(Rcpp::IntegerMatrix res)
{
  int n = res.nrow();
  int output;
  IntegerVector temp_res = res( 1, _);
  // IntegerVector temp_res = res.row(1);

  for (int r = 0; r < n; r++) {
    output = foo1(res = temp_res); ////////   Line 22
    // output = foo1(res = as<IntegerVector>(temp_res));
  }
  return output;
}

Почему я получаю эту ошибку? Как я могу извлечь нужную строку из матрицы и использовать ее в другой функции, как показано выше?

Ответы [ 2 ]

5 голосов
/ 11 февраля 2020

Подмножество не там, откуда исходит ошибка. Фактически, эта ошибка оператора происходит из более поздней части кода, вызванного из-за первой ошибки.

Сказав это, выполнение вашего кода дает:

fileb9516da5f592.cpp:22:23: error: no viable overloaded '='
    output = foo1(res = temp_res); ////////   Line 22
                  ~~~ ^ ~~~~~~~~
/Library/Frameworks/R.framework/Versions/3.6/Resources/library/Rcpp/include/Rcpp/vector/Matrix.h:83:13: note: candidate function not viable: no known conversion from 'Rcpp::IntegerVector' (aka 'Vector<13>') to 'const Rcpp::Matrix<13, PreserveStorage>' for 1st argument
    Matrix& operator=(const Matrix& other) {
            ^
/Library/Frameworks/R.framework/Versions/3.6/Resources/library/Rcpp/include/Rcpp/vector/Matrix.h:90:13: note: candidate function not viable: no known conversion from 'Rcpp::IntegerVector' (aka 'Vector<13>') to 'const SubMatrix<13>' for 1st argument
    Matrix& operator=( const SubMatrix<RTYPE>& ) ;
            ^
1 error generated.
make: *** [fileb9516da5f592.o] Error 1
clang++ -std=gnu++11 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG   -I"/Library/Frameworks/R.framework/Versions/3.6/Resources/library/Rcpp/include" -I"/private/var/folders/b0/vt_1hj2d6yd8myx9lwh81pww0000gn/T/RtmpRe7iKX/sourceCpp-x86_64-apple-darwin15.6.0-1.0.3" -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -I/usr/local/include  -fPIC  -Wall -g -O2  -c fileb9516da5f592.cpp -o fileb9516da5f592.o

Обратите внимание, первая ошибка:

fileb9516da5f592.cpp:22:23: error: no viable overloaded '='
    output = foo1(res = temp_res); ////////   Line 22
                  ~~~ ^ ~~~~~~~~

Код выдает ошибку из-за именованного передача параметра. В отличие от R , C ++ не поддерживает именованные параметры. Решение заключается в использовании позиционных параметров.

То есть измените:

    output = foo1(res = temp_res); ////////   Line 22

на:

    output = foo1(temp_res); ////////   Line 22

Вуаля!

foo(matrix(1:4))
#[1] 2
2 голосов
/ 11 февраля 2020

Согласен с @coatless и смотрел на это, пока писал свое. Ваш код по сути запутан, и вам нужно выяснить, какую проблему вы пытаетесь решить.

Здесь я решаю вопрос с вашим заголовком: извлечение строк. И так как вы хотите вернуть скаляр int, я просто суммирую первый элемент.

Код

#include <Rcpp.h>

// [[Rcpp::export]]
int foo1(Rcpp::IntegerVector res) {
  int output = res[0];
  return output;
}


// [[Rcpp::export]]
int foo(Rcpp::IntegerMatrix res) {
  int n = res.nrow();
  int output = 0;               // need to init

  for (int r = 0; r < n; r++) {
    Rcpp::IntegerVector temp_res = res( r, Rcpp::_);
    output = output + temp_res[0];
  }
  return output;
}

/*** R
M <- matrix(seq(1,9), 3, 3)
foo(M)
*/

Выход

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

R> M <- matrix(seq(1,9), 3, 3)

R> foo(M)
[1] 6
R> 
...