2016-08-05 8 views
1

は私が20 x 10行列Xを持っている、と私は1:10i,jためA[i,j,] = X[,i] * X[,j]10 x 10 x 20配列Aを作成したいです。ここでforループを使用して、簡単な解決策は以下のとおりです。列方向「外積」

X <- matrix(seq(10*20),20,10) 
A <- array(dim=c(10,10,20)) 
for (i in 1:10) 
    for (j in 1:10) 
    A[i,j,] <- X[,i] * X[,j] 

どのように私はベクトル化でこれを実装するのですか?

ありがとうございました。

答えて

2

outerを使用してください、これは何ですか?

A2 = array(apply(X, 1L, function (x) outer(x,x)), dim=c(10,10,20)) 

# test 
X <- matrix(seq(10*20),20,10) 
A <- array(dim=c(10,10,20)) 
for (i in 1:10){ 
    for (j in 1:10){ 
    A[i,j,] <- X[,i] * X[,j] 
    } 
} 

all.equal(A, A2) # TRUE 

EDIT:問題の質問の例の後更新答えが変更されました。

+0

私は質問を編集したので、 'X'はすべて一意のエントリを持っています。重要なのは、一般的なマトリックス上で列方向の外積を行うことです。 – user3294195

+0

'i、j'は' ncol(X) '(この場合は' 10')でなければなりません。 – user3294195

関連する問題