0

入力のベクトルに対して以下の関数を実行すると、一貫性のない結果が見つかりました。ベクトル化された入力を使用すると、出力列が並べ替えられているように見えます。この関数をベクトル化するためのより良い方法はありますか?

func <- function(t, alpha) { exp(matrix(-rep(t,7), ncol=7)*1:7*alpha) }

# correct    
rbind(func(3, 0.02), func(4, 0.02))

#incorrect
func(c(3, 4), 0.02)

> rbind(func(3, 0.02), func(4, 0.02))
          [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]
[1,] 0.9417645 0.8869204 0.8352702 0.7866279 0.7408182 0.6976763 0.6570468
[2,] 0.9231163 0.8521438 0.7866279 0.7261490 0.6703200 0.6187834 0.5712091

> func(c(3, 4), 0.02)
          [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]
[1,] 0.9417645 0.8352702 0.7408182 0.6570468 0.8869204 0.7866279 0.6976763
[2,] 0.8521438 0.7261490 0.6187834 0.9231163 0.7866279 0.6703200 0.5712091
4

2 に答える 2

2

結果について不正確または矛盾するものはなく、Rのリサイクル規則と要素ごとの操作がどのように適用されるかを理解しているだけです。;-)

Rは、オブジェクトを列優先の順序で格納および操作します(リサイクルルールを含む)。あなたの例は、Rが行優先の順序である場合にのみ機能します。列優先の順序付け手段matrix(-rep(t,7), ncol=7)*1:7は、次のような結果を生成します。

3*1 3*3 3*5 3*7 3*2 3*4 3*6
4*2 4*4 4*6 4*1 4*3 4*5 4*7

これは、内部的には、行列がdim属性を持つ単なるベクトルであるためです。これは、次のコマンドを実行することで確認できます。

> as.vector(matrix(-rep(3:4,7), ncol=7))
 [1] -3 -4 -3 -4 -3 -4 -3 -4 -3 -4 -3 -4 -3 -4

ベクトルの最初の2つの要素が行列の最初の列であることがわかりますか?そのため、を掛けると「一貫性のない」結果が得られます1:7。あなたは本当にRにやるように頼んでいます:

> (foo <- as.vector(matrix(-rep(3:4,7), ncol=7)) * 1:7)
 [1]  -3  -8  -9 -16 -15 -24 -21  -4  -6 -12 -12 -20 -18 -28

次の方法で「マトリックス」に戻します。

> dim(foo) <- c(2,7)
> foo
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]   -3   -9  -15  -21   -6  -12  -18
[2,]   -8  -16  -24   -4  -12  -20  -28

リサイクルルールを利用したい場合は、現在のマトリックスの転置から始める必要があります。次に、その結​​果を乗算し1:7て転置します。転置と言えば、変数の名前付けは避けたい場合がありtます。これは、転置関数の名前だからです。

func <- function(v, alpha) {
  t(exp(matrix(-rep(v,7), nrow=7, byrow=TRUE)*1:7*alpha))
}
于 2012-04-16T20:20:03.783 に答える
1

これはうまくいくでしょう:

func <- function (t,alpha) exp(-rep(t,7) * sapply(1:7,rep,length(t)) * alpha)
于 2012-04-16T20:12:08.760 に答える