C++ (c+;+;,犰狳)替换矩阵中的一部分列向量
我在Armadillo图书馆使用Rcpp。我的算法有一个for循环,在该循环中,我在每一步更新第j列,而不使用第j元素。因此,在一个周期后,输入矩阵将用新值替换所有非对角元素。为此,我编写了如下的Rcpp代码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
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的索引,我明白。我感谢你迅速而翔实的答复。