【问题标题】:How to force diagonal of a distance matrix to zero with RcppArmadillo?如何使用 RcppArmadillo 将距离矩阵的对角线强制为零?
【发布时间】:2014-03-13 12:10:38
【问题描述】:

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

但是,我在对角线上得到非零值(因为我猜测机器精度?),而我确实需要将这些数字设置为零以进一步处理距离矩阵。这是矩阵类型的问题吗?我该如何解决这个问题,而不必事后将对角线“手动”设置为零(在犰狳或 R 中),例如:

diag(d) <- 0 

确实,我想使用类似的函数来计算两个不同矩阵之间的距离,我无法预测矩阵的列在哪里相等 感谢您的帮助!

【问题讨论】:

    标签: r rcpp


    【解决方案1】:

    不可能保证为零,因为使用非整数的算法的任何实现都是使用此类数字的approximations 生效的。

    最好的办法是手动将对角线设置为零,您可以在犰狳中通过.diag() 执行此操作。例如output.diag().zeros()

    【讨论】:

    • 好的,谢谢,这看起来很简单,但是如果我现在有一个函数接受两个我想计算距离的输入矩阵,并且两个矩阵的列之一完全相同?接近零的值不会在对角线上。替换这些值是唯一的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多