私はペアワイドユークリッド距離行列を計算したいと思います。Rcpp:私の距離行列プログラムがパッケージ内の関数よりも遅い
NumericMatrix calcPWD1 (NumericMatrix x){
int outrows = x.nrow();
double d;
NumericMatrix out(outrows,outrows);
for (int i = 0 ; i < outrows - 1; i++){
for (int j = i + 1 ; j < outrows ; j ++){
NumericVector v1= x.row(i);
NumericVector v2= x.row(j);
NumericVector v3=v1-v2;
d = sqrt(sum(pow(v3,2)));
out(j,i)=d;
out(i,j)=d;
}
}
return (out) ;
}
を次のように私はダークEddelbuettelの提案によりRcppプログラムを書いたしかし、私は私のプログラムがdist
関数よりも遅いです見つけます。
> benchmark(as.matrix(dist(b)),calcPWD1(b))
test replications elapsed relative user.self sys.self user.child sys.child
1 as.matrix(dist(b)) 100 24.831 1.000 24.679 0.010 0 0
2 calcPWD1(b) 100 27.362 1.102 27.346 0.007 0 0
皆さんお気軽にお問い合わせください。私の行列はとてもシンプルです。列名や行名はありません。単純な行列です(たとえば、b=matrix(c(rnorm(1000*10)),1000,10)
など)。ここ は、私がdist
で、(method
、diag
のように)チェックする必要があるためにあまりにも多くのものがありますので、私のプログラムがdist
よりも高速である期待dist
> dist
function (x, method = "euclidean", diag = FALSE, upper = FALSE,
p = 2)
{
if (!is.na(pmatch(method, "euclidian")))
method <- "euclidean"
METHODS <- c("euclidean", "maximum", "manhattan", "canberra",
"binary", "minkowski")
method <- pmatch(method, METHODS)
if (is.na(method))
stop("invalid distance method")
if (method == -1)
stop("ambiguous distance method")
x <- as.matrix(x)
N <- nrow(x)
attrs <- if (method == 6L)
list(Size = N, Labels = dimnames(x)[[1L]], Diag = diag,
Upper = upper, method = METHODS[method], p = p, call = match.call(),
class = "dist")
else list(Size = N, Labels = dimnames(x)[[1L]], Diag = diag,
Upper = upper, method = METHODS[method], call = match.call(),
class = "dist")
.Call(C_Cdist, x, method, attrs, p)
}
<bytecode: 0x56b0d40>
<environment: namespace:stats>
のプログラムです。
なぜ高速になると思いますか?内部的には 'dist()'もコンパイルされたコードを使用しています... –
@ DirkEddelbuettel.私のプログラムは 'dist'よりも速いと期待しています。 「diag」)。 –
これは、さまざまな入力ディメンションを考慮して、異なるパートの時間がどのように異なるかを確認するためにプロファイルを作成する理由です。推測はすべて良いですが、それは間違っていることがよくあります。 _望ましい場合は_を測る。 –