【发布时间】:2018-08-15 07:33:00
【问题描述】:
使用 Rcpp/Armadillo,如何有效地提取/替换方阵的非对角线值?在 R 中,可以使用:old_values = A[row(A) == (col(A) - k)]; A[row(A) == (col(A) - k)] = new_values。使用 Armadillo,可以使用 for 循环(见下文)来实现此目标。但是有没有更简单的方法来编写代码?由于我需要对一个大矩阵(>10000 行,>10000 列)的所有k 执行此操作,因此最好考虑效率。这是一个可重现的示例:
A = matrix(1:25, 5, 5)
A[row(A) == (col(A) - 3)] # extract the 3rd off-diagnal values
A[row(A) == (col(A) - 2)] = -5 of # replace the 2nd off-diagnal values with -5
使用 for 循环的 cpp 代码:
arma::vec retrieve_off_diag_values( arma::mat A, unsigned k )
{
unsigned n_cols = A.n_cols;
arma::vec off_diag_values(n_cols - k);
for( unsigned i=0; i <(n_cols - k); i++ )
{
off_diag_values(i) = A(i, i+k);
}
return off_diag_values;
}
【问题讨论】:
-
由于您正在处理一个大矩阵,您应该避免复制矩阵。您的函数当前定义为对输入矩阵进行隐式复制:
retrieve_off_diag_values(arma::mat A)。要避免复制,请将其更改为retrieve_off_diag_values(const arma::mat& A)。&字符至关重要。