Rcpp:消除矩阵

时间:2015-10-14 07:27:49

标签: rcpp

我正在尝试创建一个带有矩阵 nxp 和索引 e 的函数,并返回通过消除获得的子矩阵e-th 列和X中的 e-th 行。我认为最简单的方法是创建 n -1 xp - 1 矩阵并插入由 e-th 行和列组成的交叉周围的角落。使用 Corner 语法,相同的方法可以与EigenRcpp一起使用。似乎Rcpp并不喜欢分配给Ranges。我收到以下错误消息:

error: non-static reference member 'Rcpp::SubMatrix<14>::MATRIX& Rcpp::SubMatrix<14>::m', can't use default assignment operator

我复制下面的代码。

我的问题: 如何为矩阵块指定值? 有更好的方法吗?

#include <Rcpp.h>
using namespace Rcpp;

NumericMatrix elimMat(NumericMatrix X, int e){

int p = X.cols() - 1;
int n = X.rows() - 1;
int f = e - 1;
NumericMatrix M = NumericMatrix(n, p);

M(Range(0, f - 1), Range(0, f - 1)) = X(Range(0, f - 1), Range(0, f - 1)); //TopLeft same
M(Range(0, f - 1), Range(f, p - 1)) = X(Range(0, f - 1), Range(f + 1, p)); //TopRight
M(Range(f, n - 1), Range(0, f - 1)) = X(Range(f + 1, n), Range(0, f - 1)); //BottomLeft
M(Range(f, n - 1), Range(f, p - 1)) = X(Range(f + 1, n), Range(f + 1, p)); //BottomRight

return M;
}

感谢任何帮助,Marco

1 个答案:

答案 0 :(得分:2)

关于此错误,

  

错误:非静态引用成员'Rcpp :: SubMatrix&lt; 14&gt; :: MATRIX&amp;   Rcpp :: SubMatrix&lt; 14&gt; :: m',不能使用默认赋值运算符

我不认为您(或客户端的任何人)可以做任何事情,因为问题来自SubMatrix private: MATRIX& m ; vec_iterator iter ; int m_nr, nc, nr ; 。根据编译器,

m

static应该是Range成员,而不是,因此错误。

虽然我无法以这种方式为您提供使用NumericMatrix作业的一般解决方法,但这里有一个可能的方法来解决您的特定问题&#34;划掉&#34; #include <Rcpp.h> // [[Rcpp::export]] Rcpp::NumericMatrix crossout(Rcpp::NumericMatrix X, int e) { Rcpp::NumericMatrix result = Rcpp::no_init_matrix(X.nrow() - 1, X.ncol() - 1); Rcpp::NumericMatrix::iterator src = X.begin(), dst = result.begin(); while (src != X.end()) { if (((src - X.begin()) % X.nrow()) != e && ((src - X.begin()) / X.nrow()) != e) { *dst = *src; ++dst; } ++src; } return result; } 的一部分:

/*** R

M <- matrix(1:9 + .5, nrow = 3)
R> all.equal(M[c(1, 3), c(1, 3)], crossout(M, 1))
#[1] TRUE

R> crossout(M, 1)
#     [,1] [,2]
#[1,]  1.5  7.5
#[2,]  3.5  9.5

M2 <- matrix(1:20 + .5, nrow = 4)
R> all.equal(M2[c(1:2, 4), c(1:2, 4:5)], crossout(M2, 2))
#[1] TRUE

R> crossout(M2, 2)
#     [,1] [,2] [,3] [,4]
#[1,]  1.5  5.5 13.5 17.5
#[2,]  2.5  6.5 14.5 18.5
#[3,]  4.5  8.5 16.5 20.5

R> any(unique(c(M2[3,], M2[,3])) %in% crossout(M2, 2))
#[1] FALSE

*/
e

上面,我正在复制&#34;来源&#34;的当前值。到目的地&#34;的迭代器迭代器,如果源迭代器的位置不在(src - X.begin()) % X.nrow()指定的列或行内。行索引获取为(src - X.begin()) / X.nrow(),列索引获取为#include <Rcpp.h> // [[Rcpp::export]] Rcpp::NumericMatrix crossout2(Rcpp::NumericMatrix X, int r, int c) { if (r >= X.nrow() || c >= X.ncol()) { Rf_error("Invalid row or column index.\n"); } Rcpp::NumericMatrix result = Rcpp::no_init_matrix(X.nrow() - 1, X.ncol() - 1); Rcpp::NumericMatrix::iterator src = X.begin(), dst = result.begin(); while (src != X.end()) { if (((src - X.begin()) % X.nrow()) != r && ((src - X.begin()) / X.nrow()) != c) { *dst = *src; ++dst; } ++src; } return result; }

修改 关于下面的评论,容纳行和列维度的非平方矩阵/不同索引是非常简单的:

public enum Days {
    [Display(Name = "Monday")]
    Mon=1, 

    [Display(Name = "Tuesday")]
    Tue=2, 

    [Display(Name = "Wednesday")]
    Wed=3 
}