【问题标题】:How to parse to rows first in Rcpp::NumericMatrix如何在 Rcpp::NumericMatrix 中首先解析为行
【发布时间】:2019-02-25 06:16:33
【问题描述】:

一般我们在c++中写一个函数来解析一个二维数组时,会先经过第一行,然后再移动到第二行。

for(int i = 0; i < ROW_SIZE; i++){
    for(int j = 0; j < COL_SIZE; j++){
        *((Mat+i*COL_SIZE) + j) = value;
    }
}

但是,当我使用 Rcpp::NumericMatrix 时,它首先解析列。

// [[Rcpp::export]]
NumericMatrix TestMatrixParsing(){
  NumericMatrix xx(4, 5);
  int xsize = xx.nrow() * xx.ncol();
  for (int i = 0; i < xsize; i++) {
    xx[i] = i+100;
  }
  return xx;
}

/*** R
TestMatrixParsing()
#      [,1] [,2] [,3] [,4] [,5]
# [1,]  100  104  108  112  116
# [2,]  101  105  109  113  117
# [3,]  102  106  110  114  118
# [4,]  103  107  111  115  119
*/

有什么方法可以强制它解析行,因为我之前的代码被编写为将矩阵存储为连续行,因此指针不必跳转等于 COL_SIZE。

【问题讨论】:

  • 你可以先转置。 许多以向量为中心的语言的列顺序很自然。

标签: rcpp


【解决方案1】:

Rcpp::NumericMatrix 只是遵循 R 布局其内存的方式,它处于列主要模式。一个简单的解决方案是转置矩阵:

#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::NumericMatrix TestMatrixParsing(){
  Rcpp::NumericMatrix xx(4, 5);
  int xsize = xx.nrow() * xx.ncol();
  xx = Rcpp::transpose(xx);
  for (int i = 0; i < xsize; ++i) {
    xx[i] = i + 100;
  }
  xx = Rcpp::transpose(xx);
  return xx;
}

/*** R
TestMatrixParsing()
#      [,1] [,2] [,3] [,4] [,5]
# [1,]  100  101  102  103  104
# [2,]  105  106  107  108  109
# [3,]  110  111  112  113  114
# [4,]  115  116  117  118  119
*/

不过,对于大型矩阵来说,这可能会很昂贵。在这种情况下,最好调整您的算法。

【讨论】:

  • Pluse “R 布局其记忆的方式” 是科学中常用的方法,所以我的问题主要在于 OPs 断言 “一般” .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 2015-04-12
相关资源
最近更新 更多