【问题标题】:In Rcpp How to create a NumericMatrix by a NumbericaVector?在 Rcpp 如何通过 NumbericaVector 创建 NumericMatrix?
【发布时间】:2021-06-17 14:45:10
【问题描述】:

在 Rcpp 中如何通过 NumbericaVector 创建 NumericMatrix?

类似

// vector_1 has 16 element

NumericMatrix mat = NumericMatrix(vector_1, nrow = 4);

谢谢。

【问题讨论】:

    标签: rcpp rcpp11


    【解决方案1】:

    编辑:我知道我们有更好的东西。更新见下文。


    看起来我们没有匹配的便利构造函数。但是你可以加入一个辅助函数——以下是最低限度可行的(应该检查n + k == length(vector))并取自其中一个单元测试:

    // [[Rcpp::export]]
    Rcpp::NumericMatrix vec2mat(Rcpp::NumericVector vec, int n, int k) {
        Rcpp::NumericMatrix mat = Rcpp::no_init(n, k);
        for (auto i = 0; i < n * k; i++) mat[i] = vec[i];
        return mat;
    }
    

    另一个构造函数采用显式尺寸,然后为您复制有效负载(通过memcpy()),无需循环:

    // [[Rcpp::export]]
    Rcpp::NumericMatrix vec2mat2(Rcpp::NumericVector s, int n, int k) {
        Rcpp::NumericMatrix mat(n, k, s.begin());
        return mat;
    }
    

    下面的完整示例:

    > Rcpp::sourceCpp("~/git/stackoverflow/66720922/answer.cpp")
    
    > v <- (1:9) * 1.0  # numeric
    
    > vec2mat(v, 3, 3)
         [,1] [,2] [,3]
    [1,]    1    4    7
    [2,]    2    5    8
    [3,]    3    6    9
     
    > vec2mat2(v, 3, 3)
         [,1] [,2] [,3]
    [1,]    1    4    7
    [2,]    2    5    8
    [3,]    3    6    9
    > 
    

    完整的源代码如下。

    #include <Rcpp.h>
    
    // [[Rcpp::export]]
    Rcpp::NumericMatrix vec2mat(Rcpp::NumericVector vec, int n, int k) {
        Rcpp::NumericMatrix mat = Rcpp::no_init(n, k);
        for (auto i = 0; i < n * k; i++) mat[i] = vec[i];
        return mat;
    }
    
    // [[Rcpp::export]]
    Rcpp::NumericMatrix vec2mat2(Rcpp::NumericVector s, int n, int k) {
        Rcpp::NumericMatrix mat(n, k, s.begin());
        return mat;
    }
    
    /*** R
    v <- (1:9) * 1.0  # numeric
    vec2mat(v, 3, 3)
    vec2mat2(v, 3, 3)
    */
    

    根据您想对矩阵对象(线性代数?)做什么,您可能需要考虑 RcppArmadillo(或 RcppEigen),因为这些包也有大量的向量/矩阵转换器。

    【讨论】:

    • 我认为vec.attr("dim") = Rcpp::Dimension( n_row, n_col ); 也可以将向量转换为矩阵 - 参考:teuder.github.io/rcpp4everyone_en/…
    • 很好,是的,我想我也这样做了。从某种意义上说,(C++)类仍然是一个向量,这有点脏。
    • 是的,我设置了返回类型SEXP,因为我认为它不喜欢返回Matrix&lt;&gt;
    • 它甚至在链接的引用中指出-“因此,如果您想在Rcpp中将其转换为Matrix类型,则需要使用as()函数。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多