在 Rcpp/RcppArmadillo 中,我想要执行以下操作:从 n x n 矩阵 A,我想提取子矩阵 A[-j, -j],其中 j 是索引向量:在 R 中,它可以像
A = matrix(1:16, 4, 4)
j = c(2, 3)
A[-j, -j]
似乎此功能在 Rcpp 或 RcppArmadillo 中不可用 - 抱歉,如果我忽略了某些内容。 R 中的一种方法是
pos = setdiff(1:nrow(A), j)
A[pos, pos]
这将延续到 RcppArmadillo,但必须创建向量 pos 作为 j 的补集似乎很尴尬 - 而且我不知道如何有效地做到这一点。
有人有有效实现的想法/或分享一段代码吗?
最佳答案
Armadillo docs有功能.shed
它接受一个参数“...包含要删除的行/列/切片的索引”。根据我的阅读,删除行和列将需要两次调用 .shed()
。
使用您的示例
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
// [[Rcpp::export]]
arma::mat fun(arma::mat X, arma::uvec row, arma::uvec col) {
X.shed_cols(col); // remove columns
X.shed_rows(row); // remove rows
return(X);
}
/***R
A = matrix(1:16, 4, 4)
j = c(2, 3)
A[-j, -j]
# minus one for zero indexing
fun(A, j-1, j-1)
*/
关于r - 矩阵索引中的负下标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73526486/