我有以下Rcpp / RcppArmadillo函数来计算矩阵中的相关距离
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::export]]
arma::mat cordiss(NumericMatrix X){
int nX = X.nrow(), kX = X.ncol();
arma::mat XX(X.begin(), nX, kX, false);
arma::mat output = (1 - arma::cor(XX.t(), XX.t()))/2;
return output.t();
}
使用Rcpp :: sourceCpp获取后,我可以执行以下操作:
d <- cordiss(matrix(rnorm(1000),ncol=10))
然而,我在对角线上得到非零值(因为我猜机器精度?),而我真的需要将这些数字设置为零以进一步处理距离矩阵。这是矩阵类型的问题吗?如何解决这个问题,而不必在事后将对角线“手动”设置为零(在Armadillo或R中),例如:
diag(d) <- 0
实际上我想用一个类似的函数来计算两个不同矩阵之间的距离,我无法预测矩阵列的相等位置 谢谢你的帮助!
答案 0 :(得分:1)
无法保证零,因为使用非整数的算法的任何实现都使用approximations这样的数字生效。
您最好的选择是手动将对角线设置为零,您可以通过.diag()在Armadillo中进行操作。例如,output.diag().zeros()