Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ (c+;+;,犰狳)替换矩阵中的一部分列向量_C++_R_Rcpp_Armadillo - Fatal编程技术网

C++ (c+;+;,犰狳)替换矩阵中的一部分列向量

C++ (c+;+;,犰狳)替换矩阵中的一部分列向量,c++,r,rcpp,armadillo,C++,R,Rcpp,Armadillo,我在Armadillo图书馆使用Rcpp。我的算法有一个for循环,在该循环中,我在每一步更新第j列,而不使用第j元素。因此,在一个周期后,输入矩阵将用新值替换所有非对角元素。为此,我编写了如下的Rcpp代码 arma::mat submatrix( arma::mat A, arma::uvec rowid){ for(int j = 0; j < A.n_rows; j++){ A.submat(rowid, "j") = randu(A.n

我在Armadillo图书馆使用Rcpp。我的算法有一个for循环,在该循环中,我在每一步更新第j列,而不使用第j元素。因此,在一个周期后,输入矩阵将用新值替换所有非对角元素。为此,我编写了如下的Rcpp代码

arma::mat submatrix(
        arma::mat A,
        arma::uvec rowid){
  for(int j = 0; j < A.n_rows; j++){
    A.submat(rowid, "j") = randu(A.n_rows - 1);
  }
  return A;
}
arma::mat子矩阵(
阿玛:马特A,
arma::uvec rowid){
对于(int j=0;j
但是,我不确定子矩阵视图在for循环中如何工作

如果您将上述代码中的“j”替换为下面的任意一个,那么这个玩具示例
子矩阵(矩阵(rnorm(3*4),nrow=3,ncol=4),c(1:2))
将返回一条错误消息

  • (uvec)j
    错误:Mat::elem():不兼容的矩阵维度:2x0和2x1

  • j
    (unsigned int)j
    没有匹配的成员函数用于调用“submat”


我如何处理这个问题?如有任何意见,将不胜感激

我不得不承认,您还没有完全理解您的问题——尽管我想我已经有了替换给定行或列中“除一之外的所有”元素的想法

但是你的代码有很多问题。下面的代码是简化的(因为我替换了整行),但它是逐行分配的。您可能需要这样的
X.submat(第一行,第一列,最后一行,最后一列)
,可能分为两个块(分配到对角线上方,然后分配到下方)。Armadillo文档中有更多关于索引的内容,Rcpp图库中也有更多内容

#include <RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]] 
arma::mat submatrix(arma::mat A, arma::uvec rowid, int k) {
  for (arma::uword j = 0; j < A.n_rows; j++) {
    A.row(j) = arma::randu(A.n_rows).t();
  }
  return A;
}

/*** R 
M <- matrix(1:16,4,4)
submatrix(M, 1, 1)  
*/
#包括
//[[Rcpp::depends(RcppArmadillo)]]
//[[Rcpp::导出]]
arma::mat子矩阵(arma::mat A,arma::uvec rowid,int k){
对于(arma::uwordj=0;j我不知怎么得到了你想要的,但是你的代码有误导性。例如,您将
j
作为输入参数,但随后为循环定义了一个新参数。请在R中提供一个您想要的附加代码。我注意到了同样的情况,并将参数
j
重命名为
k
,该参数仍然未使用。谢谢(一直如此),德克。在我的帖子中,我尝试使用
X.submat(行索引的向量,列索引的向量)
。有没有一种方法可以使用它来避免你提到的两个块?当然,但是你必须首先构建那些向量,它们使用无符号整数,所以很难(er)从使用有符号整数的R开始。也许能在画廊里看到Rcpaparmadillo的索引,我明白。我感谢你迅速而翔实的答复。