我不确定我是否理解问题或尝试的答案。你仍然在这里返回矩阵。并且 Rcpp 对重塑和更高级的 Matrix 操作的支持有限。
稍微简化的代码版本:
代码
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector matrix2vector(NumericMatrix m, const bool byrow=false){
if (byrow){
Rcout << "warning: default by column\n";
m = transpose(m);
}
return NumericVector(m);
}
/*** R
m <- matrix(1:15,5,3)
print(matrix2vector(m, byrow = TRUE))
print(matrix2vector(m, byrow = FALSE))
*/
输出
R> Rcpp::sourceCpp("~/git/stackoverflow/61036707/question.cpp")
R> m <- matrix(1:15,5,3)
R> print(matrix2vector(m, byrow = TRUE))
warning: default by column
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
[3,] 11 12 13 14 15
R> print(matrix2vector(m, byrow = FALSE))
[,1] [,2] [,3]
[1,] 1 6 11
[2,] 2 7 12
[3,] 3 8 13
[4,] 4 9 14
[5,] 5 10 15
R>
你在这里执行的只是一个转置。
我会尝试 RcppArmadillo,它 确实 具有明确的 rowvec 和 colvec 类型,后者被别名为 vec。我将不得不检查它在将“逐列行”元素重塑为逐列向量的行方面的建议。
编辑:确实(经常)在 RcppArmadillo 中更容易。
代码
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::mat matrix2vector(arma::mat m, const bool byrow=false){
if (byrow) {
return m.as_row();
} else {
return m.as_col();
}
}
/*** R
m <- matrix(1:15,5,3)
print(matrix2vector(m, byrow = TRUE))
print(matrix2vector(m, byrow = FALSE))
*/
输出
R> Rcpp::sourceCpp("~/git/stackoverflow/61036707/answer.cpp")
R> m <- matrix(1:15,5,3)
R> print(matrix2vector(m, byrow = TRUE))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
[1,] 1 6 11 2 7 12 3 8 13 4 9 14 5 10 15
R> print(matrix2vector(m, byrow = FALSE))
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
[5,] 5
[6,] 6
[7,] 7
[8,] 8
[9,] 9
[10,] 10
[11,] 11
[12,] 12
[13,] 13
[14,] 14
[15,] 15
R>
请注意,我使用arma::mat 作为返回类型以不与colvec 或rowvec 冲突。您可以选择其中一个,但您可以不返回答案。
编辑 2: 根据下面的评论:如果你真的只是想重塑你已经拥有的内容,则不需要 Rcpp。只需核对 dim 属性。在 R(和 C++,如果你愿意)级别工作:
R> m
[,1] [,2] [,3]
[1,] 1 6 11
[2,] 2 7 12
[3,] 3 8 13
[4,] 4 9 14
[5,] 5 10 15
R> dim(m)
[1] 5 3
R> dim(m) <- NULL
R> m
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
R>