2014-03-13 43 views
2

我有以下RCPP/RcppArmadillo函數計算相關距離在矩陣如何用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 

事實上,我想使用一個類似的函數來計算兩個不同的矩陣之間的距離爲我無法預測矩陣的列將在哪裏相等 感謝您的幫助!

回答

1

不可能保證零,因爲使用非整數的算法的任何實現實際上都使用這種數字的approximations

您最好的選擇是手動將對角線設置爲零,您可以在犰狳中通過.diag()進行設置。例如,output.diag().zeros()

+0

好的,感謝這似乎很容易,但如果我現在有一個函數接受兩個輸入矩陣,我想要計算距離,並且兩個矩陣中的一列完全相同?接近零值不會在對角線上。取代這些值是唯一的解決方案嗎? – user3415094