我在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) j
:
error: Mat::elem(): incompatible matrix dimensions: 2x0 and 2x1
j
或(unsigned int) j
:no matching member function for call to 'submat'
如何处理此问题?任何评论将不胜感激!
答案 0 :(得分:1)
我不得不承认,您并没有完全理解您的问题-尽管我认为,但我的想法是替换给定行或列中的“除一个以外的所有元素”。
但是您的代码有很多问题。下面的代码是简化的(当我替换整行时),但是它逐行分配。您可能想要类似.jar
的内容,可能需要两个块(分别在对角线上方和下方)。 Armadillo文档中有很多有关索引的内容,Rcpp Gallery中还有更多内容。
X.submat( first_row, first_col, last_row, last_col )