(c++, armadillo) 从矩阵中替换列向量的一部分

(c++, armadillo) Replace a part of column vector from a matrix

我在 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)) 将 return 一条错误消息。

我该如何处理这个问题?如有任何评论,我们将不胜感激!

我不得不承认你没有完全理解你的问题 - 虽然我 认为 我得到了替换给定行或列的 'all but one' 元素的想法.

但是你的代码有很多问题。以下代码已简化(因为我替换了整行),但它逐行分配。你可能想要这样的东西 X.submat( first_row, first_col, last_row, last_col ),可能分成两块(分配在对角线上方,然后在下方)。 Armadillo 文档中有更多关于索引的内容,Rcpp Gallery 中也有更多内容。

#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)  
*/