2015-11-03 19 views
7

當我學習Rcpp類/數據結構時遇到了一個新手問題:是否有成員函數來刪除類Rcpp::NumericMatrix的對象的行/列? (或其他類型type **Matrix - 我假設它是一個模板類)?Rcpp NumericMatrix - 如何擦除行/列?

library(Rcpp) 
cppFunction(' 
    NumericMatrix sub1 {NumericMatrix x, int& rowID, int& colID) { 
    // let's assume separate functions for rowID or colID 
    // but for the example case here 
    x.row(rowID).erase(); // ??? does this type of member function exist? 
    x.col(colID).erase(); // ??? 
    return x; 
}') 

如果這種類型的成員函數不存在,那麼這個怎麼辦?

cppFunction('NumericMatrix row_erase (NumericMatrix& x, int& rowID) { 
    // a similar function would exist for removing a column. 
    NumericMatrix x2(Dimension(x.nrow()-1, x.ncol()); 
    int iter = 0; // possibly make this a pointer? 
    for (int i = 0; i < x.nrow(); i++) { 
    if (i != rowID) { 
     x2.row(iter) = x.row(i); 
     iter++; 
    } 
    } 
    return x2; 
}') 

或者我們希望刪除一組行/列:

cppFunction('NumericMatrix row_erase (NumericMatrix& x, IntegerVector& rowID) { 
    // a similar function would exist for removing a column. 
    rowID = rowID.sort(); 

    NumericMatrix x2(Dimension(x.nrow()- rowID.size(), x.ncol()); 
    int iter = 0; // possibly make this a pointer? 
    int del = 1; // to count deleted elements 
    for (int i = 0; i < x.nrow(); i++) { 
    if (i != rowID[del - 1]) 
     x2.row(iter) = x.row(i); 
     iter++; 
    } else { 
     del++; 
    } 
    } 
    return x2; 
}') 
+1

我回答了類似的問題[這裏](http://stackoverflow.com/questions/33119163/rcpp-eliminating (我認爲)將你的兩個目標組合成一個函數。如果是這樣,您應該可以輕鬆地將其分別調整爲兩個單獨的行和列消除函數。 – nrussell

+0

@nrussell - 謝謝,我會去看看 –

回答

0

是,這兩個做的工作(以上固定我的錯別字)。儘管我試圖用Rcpp::NumericMatrix::iterator iter代替int iter,但我得到了一個轉換錯誤。任何解決這個問題?

請注意,我們不需要row_erase(NumericMatrix& x, int& ref),因爲這是row_erase(NumericMatrix& x, IntegerVector& ref)的特殊情況。

NumericMatrix row_erase (NumericMatrix& x, IntegerVector& rowID) { 
    rowID = rowID.sort(); 

    NumericMatrix x2(Dimension(x.nrow()- rowID.size(), x.ncol())); 
    int iter = 0; 
    int del = 1; // to count deleted elements 
    for (int i = 0; i < x.nrow(); i++) { 
    if (i != rowID[del - 1]) { 
     x2.row(iter) = x.row(i); 
     iter++; 
    } else { 
     del++; 
    } 
    } 
    return x2; 
} 

NumericMatrix col_erase (NumericMatrix& x, IntegerVector& colID) { 
    colID = colID.sort(); 

    NumericMatrix x2(Dimension(x.nrow(), x.ncol()- colID.size())); 
    int iter = 0; 
    int del = 1; 
    for (int i = 0; i < x.ncol(); i++) { 
    if (i != colID[del - 1]) { 
     x2.col(iter) = x.column(i); 
     iter++; 
    } else { 
     del++; 
    } 
    } 
    return x2; 
} 
4

如何使用RcppArmadillo?我想代碼的意圖會更加清晰......

#include <RcppArmadillo.h> 
// [[Rcpp::depends(RcppArmadillo)]] 

using namespace arma; 

// [[Rcpp::export]] 
mat sub1(mat x, uword e) { 
    x.shed_col(e-1); 
    x.shed_row(e-1); 
    return x; 
} 

/*** R 
sub1(matrix(1:9,3), 2) 
*/ 

> sub1(matrix(1:9,3), 2) 
    [,1] [,2] 
[1,] 1 7 
[2,] 3 9 
+1

謝謝!任何機會,你可以提供與Eigen類似的答案? –

+0

據我所知,Eigen沒有提供這種類型的操作的易用性功能...如果我需要_manipulate_存儲在矩陣中的數據,我每次都選擇Armadillo在Eigen上。 – Thell

+0

嗯---很高興知道。我的研究名單上仍然有Eigen/Armadillo。你有偏好嗎?我所做的搜索一直沒有結果 –