3

R の行列でtcrossprod関数を使用しています。これは、データとその転置の外積を計算します。つまり、data %*% t(data) です。

問題は、個々の操作 (data の行と t(data) の列の間) を乗算操作にしたくないことです。そこに自分の関数を指定して、同じアルゴリズムを実装することはできますが、乗算ではなく別のことを行います。

マトリックスをループして必要な操作を実行することで同じ結果を達成していますが、ループするとこのアプローチが遅くなります。

これが私が現在行っていることです(ただし、 * 操作を別のものに置き換えています):

count<-nrow(data)
output<-sapply(1:count, function(x){
        sapply(1:count, function(y){
                sum((data[x,]+data[y,])*abs(data[x,]-data[y,]))
            })
    })

どんな助けでも大歓迎です。

4

1 に答える 1

2

これにより、遅いsapplyループの 1 つがはるかに高速な行列演算に置き換えられます。

sapply(1:count, function(i, x) {
   colSums((x + x[, i]) * abs(x - x[, i]))} , x = t(data))

そして、それを少し速くするために、次のものに置き換えsapplyますvapply

vapply(1:count, function(i, x) {
   colSums((x + x[, i]) * abs(x - x[, i]))} , numeric(count), x = t(data))

それでも遅すぎる場合は、Rcpp ソリューションで十分でしょう。それ以外の場合、これよりも大幅に高速なベースのみのソリューションは見当たりません (ただし、間違っていることが証明されれば幸いです)。

于 2014-09-10T11:37:55.777 に答える