-5

ベクトルの最初の 2 つの値が与えられます。前の 2 つのベクトルから次のベクトルの値を計算したい。Excel で行うのと同じです。最初の 2 つのセルに数字を入力し、3 番目のセルに数式を書き込んで、それを他のセルに適用します。しかし、私はループなしでやりたいです。

やりたいこと:

x = c()
x[1] = 1
x[2] = 2
for (i in 3:10)
    x[i] = 2*x[i-1] - 0.5*x[i-2]

x

> x
 [1]   1.0000   2.0000   3.5000   6.0000  10.2500  17.5000  29.8750  51.0000
 [9]  87.0625 148.6250
> 

現在の値の計算でベクトルの以前の値を使用したいのですが、今行った方法ではありません。

4

2 に答える 2

4

次のようにループせずに、シリーズの i 番目の要素を見つけることができます。

roots <- polyroot( c(0.5, -2, 1) )
roots <- Re(roots)

k <- solve( rbind( 1, roots ), c(1,2) )

genfun <- function(n) {
    as.vector(k %*% roots^(n-1))
}

genfun(1)
genfun(2)
genfun(3)
genfun(4)

次のようにすると、ループと比較するのが簡単になります。

genfun2 <- Vectorize(genfun)
genfun2( 1:10 )

ただし、明示的なループを使用しない場合でも、いくつかのループの使用法があります (:は内部ループを使用し、内部ループmapplyも使用します)。そのため、これは「ループなし」の要件には完全には適合しません。手で 'genfun(1) ,genfun(2) ,genfun(3)' と入力しても、... コンピューターを強制的にループさせなくても、wetware ループを使用しているので、それが重要かどうかはわかりません。 .

個人的には、ループの方が簡単なオプションのようです。また、ベクトル全体を事前に割り当てて効率的なループを作成すると、ループはおそらく他のアプローチよりも遅くなることはありません。

編集

実際には、再帰関数を使用してこれを行うこともできます (そしてすべての中間計算を保存します)。それが「ループなし」と見なされるかどうかはわかりません。いずれにせよ、単純なループよりも複雑で遅くなると思います。

于 2013-01-30T20:43:33.127 に答える
1

あなたの質問「可能ですか」に対する答えは「いいえ」だと思うので、これを答えとして書いています。

私の知る限り、(少なくともバックグラウンドで) ループせずにこれを行うことは不可能です。これは、連続する各ステップで新しい値を再ポーリングする必要があるためです。Excelでは、あなたが言及している「オートフィル」オプションを知っていますが、バックグラウンドでループしています。

「embed」関数のようにラグの計算を使用しても、以前の値を更新するたびに関数を再度呼び出す必要があります。私が見ているように、あなたがやりたいことのロジックは、各行を手動で書きたくない限り、基本的にループです。ベクトル化されたステートメントはすべての作業を一度に実行する必要があるため、ベクトル化されたアプローチがうまくいくかどうかはわかりません。

于 2013-01-30T19:55:31.647 に答える