일반적으로 2 차원 행렬을 Rcpp에서 R의 벡터로 변환하고 싶습니다. "as (m)"을 사용하여 매우 간단해야합니다. 그러나 여전히 R에서 행렬을 얻습니다. 이유가 궁금합니다. Rcpp에서 attr을 수동으로 제거해야합니까?
#include <Rcpp.h>
#include <string>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector matrix2vector(NumericMatrix m, const bool byrow=false){
NumericVector x;
if(byrow){
Rcout<< "warning: default by column\n";
m = transpose(m);
x = as<NumericVector>(m);
}else{
x = as<NumericVector>(m);
}
return(x);
}
/*** R
m=matrix(1:15,5,3)
matrix2vector(m,byrow=T)
*/
질문이나 시도한 답변을 이해했는지 잘 모르겠습니다. 여기에서 여전히 행렬을 반환하고 있습니다. 그리고 Rcpp는 모양 변경 및 고급 매트릭스 작업을 제한적으로 지원합니다.
코드의 약간 단순화 된 버전 :
암호#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>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다