(C ++,Armadillo)从矩阵替换部分列向量

时间:2019-07-30 14:13:43

标签: 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_rows - 1);
  }
  return A;
}

但是,我不确定子矩阵视图在for循环中如何工作。

如果将上面代码中的“ j”替换为以下任何一个,则此玩具示例 submatrix(matrix(rnorm(3 * 4), nrow = 3, ncol = 4), c(1:2))  将返回错误消息。

  • (uvec) jerror: Mat::elem(): incompatible matrix dimensions: 2x0 and 2x1

  • j(unsigned int) jno matching member function for call to 'submat'

如何处理此问题?任何评论将不胜感激!

1 个答案:

答案 0 :(得分:1)

我不得不承认,您并没有完全理解您的问题-尽管我认为,但我的想法是替换给定行或列中的“除一个以外的所有元素”。

但是您的代码有很多问题。下面的代码是简化的(当我替换整行时),但是它逐行分配。您可能想要类似.jar的内容,可能需要两个块(分别在对角线上方和下方)。 Armadillo文档中有很多有关索引的内容,Rcpp Gallery中还有更多内容。

X.submat( first_row, first_col, last_row, last_col )