(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 一条错误消息。
(uvec) j
:
error: Mat::elem(): incompatible matrix dimensions: 2x0 and 2x1
j
或 (unsigned int) j
: no matching member function for call to 'submat'
我该如何处理这个问题?如有任何评论,我们将不胜感激!
我不得不承认你没有完全理解你的问题 - 虽然我 认为 我得到了替换给定行或列的 '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)
*/
我在 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 一条错误消息。
(uvec) j
:error: Mat::elem(): incompatible matrix dimensions: 2x0 and 2x1
j
或(unsigned int) j
:no matching member function for call to 'submat'
我该如何处理这个问题?如有任何评论,我们将不胜感激!
我不得不承认你没有完全理解你的问题 - 虽然我 认为 我得到了替换给定行或列的 '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)
*/