2

私は R の初心者です。行列 x の各行間のドット積を計算するための double for ループを作成し、時間ごとのサンプル X のすべての観測値を計算しました。サンプル X の観測値を列として、x の行を行として持つ行列に結果を格納する方法がわかりません。誰かが私を助けてくれることを願っています。前もって感謝します。

ここに私のコード:

Dot.product <- function(x,X){
theta <- matrix(NA,nrow=nrow(x),ncol=nrow(X),byrow=T)
for(i in 1:nrow(X)){
for(j in 1:nrow(x)){
  theta[i,j] <- acos((sum(x[j,]*X[i,]))/(sqrt
        (sum(x[j,]*x[j,]))*sqrt(sum(t(X[i,])*X[i,]))))
 }}

return(theta)}
4

1 に答える 1

2

寸法を間違えています。に置き換えるtheta[i,j]theta[j,i]、それでうまくいくはずです。

おまけとして、ダブルループの代わりにベクトル化された関数を使用して、関数を作成する方法を次に示します。

Dot.product <- function(x, X) {
   a <- tcrossprod(x, X)
   n1 <- sqrt(rowSums(x * x))
   n2 <- sqrt(rowSums(X * X))
   acos(a / n1[row(a)] / n2[col(a)])
}

それらが同じ結果を生成することを確認しました。

于 2013-06-18T23:00:18.377 に答える