如何用RcppArmadillo将距离矩阵的对角线强制为零?

时间:2014-03-13 12:10:39

标签: r rcpp

我有以下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 

实际上我想用一个类似的函数来计算两个不同矩阵之间的距离,我无法预测矩阵列的相等位置 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

无法保证零,因为使用非整数的算法的任何实现都使用approximations这样的数字生效。

您最好的选择是手动将对角线设置为零,您可以通过.diag()在Armadillo中进行操作。例如,output.diag().zeros()