0

関数を適用するために、Mで選択する必要がある「行インデックスのペア」を含む行列Mと行列Lがあります。この関数は、2 行と M の列数が同じ行列を返します。

set.seed(1)
# M has even number of rows
M = matrix(runif(24), ncol = 3)
# each row of L is a pair of row indexes that will be selected in M
# so the first 'pair' is M[1,] M[3,], the second is M[2,] M[4,] and so on
L = matrix(c(1,3,2,4,6,7), ncol = 2, byrow = T)

関数 f は次のとおりです。

f = function(r1, r2)
{
 matrix(c(r1+r2, r1-r2), nrow = 2, byrow = T)
}

問題は、L をループし、「ペア」ごとに f を適用し、結果を別の行列に追加する必要があることです。したがって、上記のコードの場合、最終結果は次のようになります。

#first row of L
res1 = f(M[1,], M[3,])
#second row of L
res2 = f(M[2,], M[4,])
#third row of L
res3 = f(M[6,], M[7,])

#append everything
RES = rbind(res1, res2, res3)

この操作をベクトル化するにはどうすればよいですか? L の行インデックスはランダムであり、最終結果の行の順序は重要ではありません。

助けてくれてありがとう!

4

1 に答える 1

2

f行列Mを追加の引数として取るもので関数をラップするとどうなりますか?

fm <- function(rowVector, mat) {
  f(mat[rowVector[1],], mat[rowVector[2],])
}

次に、次のように呼び出しますapply

apply(L, 1, fm, mat=M)

           [,1]       [,2]        [,3]
[1,]  0.8383620  1.2803317  1.84306495
[2,] -0.3073447 -0.5360839 -0.04628558
[3,]  0.8350886  0.2383430  1.15394514
[4,]  0.4231395 -0.1147705 -0.38573770
[5,]  1.0976537  1.7693513  0.86381629
[6,]  0.3375833  0.2144609 -0.43953124
于 2012-09-14T20:23:27.917 に答える