2017-06-13 11 views
-1

Rのリストの要素のペアごとの組み合わせを反復し、その組み合わせを入力として使用して関数を実行したいとします。リスト内の要素の組み合わせに関数を適用する

この最小限の例では、I(1)は3つの行列を定義し、(2)それらを要素として行列を含むリストに結合し、次に(3)は要素の組み合わせの内積を計算したいリスト(すなわち、マトリックス1対マトリックス2およびマトリックス2対マトリックス3)。

set.seed 

m1 = as.matrix(replicate(2, rnorm(2))) 
m2 = as.matrix(replicate(2, rnorm(2))) 
m3 = as.matrix(replicate(2, rnorm(2))) 

matrix.list = list(m1, m2, m3) 

dot.prod = function(matrix.x, matrix.y){ 
    return(matrix.x %*% matrix.y) 
} 

は、これまでのところ私はdot.prodのための入力としてmatrix.listのすべての組み合わせを持って、次の()ネストされたループを使用しています。

for (i in 1:length(matrix.list)){ 

    for (j in 1:length(matrix.list)){ 

      print(dot.prod(matrix.list[[i]], matrix.list[[j]])) 
    } 
} 

Rの組み合わせ関数(combn()など)を使用してこれを行うことは可能ですか?私はどんな提案にも非常に感謝しています。

編集:関数自体は問題ではありません - 私はちょうどあなたを与える

oo <- outer(matrix.list, matrix.list, Vectorize(crossprod, SIMPLIFY = FALSE)) 

をやってみましょう任意のR関数の入力として

+1

あなたはこの例では所望の出力再現性の例(ちょうど先頭に 'set.seed'を追加)し、ショーを提供してもらえますか?最後にどのような構造を望んでいるのか、どの構造から始めているのかは私には完全には分かりません。 – lmo

答えて

2

をリストからの要素の組み合わせを使用する方法を知りたいですマトリックスリスト結果へのアクセスは便利です。 oo[1,2]は(実際にリストoo[1,2][[1]]に入る)マトリックス1およびマトリックス2

注間のクロス製品を提供し、マトリックスのクロス製品は%*%ではありません(ただし、あなたが主張する場合は、Vectorize("%*%", SIMPLIFY = FALSE)を使用します)。操作が対称でないため、oo[1,2]oo[2,1]とは異なります。

How to perform pairwise operation like `%in%` and set operations for a list of vectorsを参照してください。あなたの応答のための


感謝。明確にするには:最初の質問で述べたように、クロスプロダクトではなくドットプロダクトを計算します。しかし、関数そのものは関係ありません。リストからの要素の組み合わせをR関数の入力として使用する方法を知りたいと思います。

あなたが望むものはありません。あなたにいくつかのオプションを与え、自分で拾う。彼らはすべて異なっている。

これは?

combn(matrix.list, 2, function (u) u[[1]] %*% u[[2]]) 

これ?

mapply("%*%", matrix.list[-length(matrix.list)], matrix.list[-1], SIMPLIFY = FALSE) 
+0

お返事ありがとうございます。明確にするには:最初の質問で述べたように、クロスプロダクトではなくドットプロダクトを計算します。しかし、関数そのものは関係ありません。リストからの要素の組み合わせをR関数の入力として使用する方法を知りたいと思います。 –

関連する問題