2012-04-16 12 views
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 

答えて

2

あり不正確または結果について一貫性のないものは、いないRのリサイクルルールの唯一のご理解とどのように要素ごとの操作が適用されます。 ;-)

Rは、列優先順序(リサイクル規則を含む)でオブジェクトを格納し、操作します。あなたの例は、Rが行優先順位の場合にのみ機能します。これは内部的に、行列がdim属性を持つだけのベクトルであるからである

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 

:列優先順序はmatrix(-rep(t,7), ncol=7)*1:7のような結果を生むことを意味します。あなたは実行することで、これを見ることができます:

> 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を掛け合わせると「矛盾する」結果が得られます。バック

> (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 

電源を入れ、それを経由して「マトリックス」に:あなたが本当にしRを求めている

> 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)) 
} 
+0

回答ありがとうございます。私はまた、列メジャー対行メジャーオーダーの詳細についても感謝しています(私はウィキペディアでこれを見ようとしていました)。私はRが期待どおりに動いていると仮定しましたが、私はロジックのより深い理解が必要でした。 – user338714

1

これは動作します:

func <- function (t,alpha) exp(-rep(t,7) * sapply(1:7,rep,length(t)) * alpha) 
関連する問題