C++ 使用RcppArmadillo在矩阵的列上应用函数可以工作,但在行上应用时返回错误

C++ 使用RcppArmadillo在矩阵的列上应用函数可以工作,但在行上应用时返回错误,c++,rcpp,armadillo,rcpparmadillo,C++,Rcpp,Armadillo,Rcpparmadillo,我在Rcpp中编写了一个函数qSelectMbycol,它按时返回每列的第k个最大元素。此功能正常工作。如果我尝试执行相同的操作,但处理行而不是列函数qSelectMbyrow,它将返回错误:Mat::init:请求的大小与列向量布局不兼容。有人知道我做错了什么吗?我将此文件保存为qselect.cpp: 我还试着插入 typedef std::vector<double> stdvec; 在我的qSelectMbyrow函数中,尽管该函数随后运行,但与在列上应用相比,它运行得

我在Rcpp中编写了一个函数qSelectMbycol,它按时返回每列的第k个最大元素。此功能正常工作。如果我尝试执行相同的操作,但处理行而不是列函数qSelectMbyrow,它将返回错误:Mat::init:请求的大小与列向量布局不兼容。有人知道我做错了什么吗?我将此文件保存为qselect.cpp:

我还试着插入

  typedef std::vector<double> stdvec;
在我的qSelectMbyrow函数中,尽管该函数随后运行,但与在列上应用相比,它运行得很慢,如果运行100次,还会使我的R会话崩溃。

问题在于arma::vec实际上是arma::colvec请参见。因此,我们可以通过改变

arma::vec y = Y.row(i);
这是不兼容的,因为它认为你想要一个只有一列的矩阵,但你试图给它一个只有一行的矩阵

arma::rowvec y = Y.row(i);
问题是arma::vec实际上是arma::colvec,请参见。因此,我们可以通过改变

arma::vec y = Y.row(i);
这是不兼容的,因为它认为你想要一个只有一列的矩阵,但你试图给它一个只有一行的矩阵

arma::rowvec y = Y.row(i);

您是否尝试过更改arma::vec y=y.rowi;到arma::rowvec y=y.rowi;?哈,谢谢-这就成功了!如果你愿意,你可以把它作为一个答案发布!很高兴这是一个简单的答案。为了提高速度,您可以省略arma::mat YM.memptr,M.n_rows,M.n_cols;arma::rowvec y=y.rowi已经制作了一份副本;哈,谢谢你让我知道-这确实也可以与OpenMP结合使用,速度稍微快一点!您是否尝试过更改arma::vec y=y.rowi;到arma::rowvec y=y.rowi;?哈,谢谢-这就成功了!如果你愿意,你可以把它作为一个答案发布!很高兴这是一个简单的答案。为了提高速度,您可以省略arma::mat YM.memptr,M.n_rows,M.n_cols;arma::rowvec y=y.rowi已经制作了一份副本;哈,谢谢你让我知道-这确实也可以与OpenMP结合使用,速度稍微快一点!
arma::rowvec y = Y.row(i);