6

次のようなコードをベクトル化することは可能ですか?

length(x) <- 100;
x[1]      <- 1;
y         <- rnorm(100);

for(i in 2:100) {
    x[i] <- 2 * y[i] * x[i-1];
}

これは些細な例ですが、アイデアを説明するのに役立ちます。

forベクトルの i 番目の値が (i-1) 番目の値に依存するコードを記述する必要があることがよくあります。可能であれば、プロファイリングがこの型の関数を示唆しているため、ループを必要とせずにこれを記述したいと考えています。私のコードの主要なボトルネックです。

この操作はベクトル化できるのでfor()、計算でループを使用する必要はありませんか?

4

5 に答える 5

11

一般に、ベクトル化された解が必要な場合は、再帰関係を解く必要があります。

于 2011-01-14T21:15:09.423 に答える
5

あなたが持っている例では、x[i] の式を計算し、ベクトル化できるかどうかを確認できます。この場合、cumprod が機能すると思います。

x <- c(1, cumprod(2*y)[1:99])

場合によっては、filterコマンドを畳み込みモードまたは再帰モードで使用することもできます。見る?filter

ただし、上記の型の 1 つに適合する n 番目の値の式を作成できない場合は、次のようなパッケージを使用するinlineRcpp、C/C++ のループでこれを記述してみてください。

于 2011-01-14T21:20:06.977 に答える
1

バータライズされていないコードは C++ で記述できます。

library(inline)
myfun <- cxxfunction(signature(y="numeric"), body='
Rcpp::NumericVector yvec(y);
int ysize = yvec.size();
Rcpp::NumericVector result(ysize);
if (ysize > 0) {
    result[0] = 1;
    for (int i = 1; i < ysize; i++) {
        result[i] = 2 * yvec[i] * result[i-1];
    }
}
return result;
', plugin="Rcpp")

次に、R からこの関数を呼び出します。

y <- rnorm(100);
x <- myfun(y);
于 2012-11-14T17:47:43.670 に答える
1

このプロット コマンドの内部は同等です。繰り返し実行するのはかなり興味深いです:

plot(c(1, 2^(2:length(x)-1)*cumprod(rnorm(99) )) )

于 2011-01-16T00:04:50.703 に答える
0

これについてはまだ完全な詳細はわかりませんが、この関数filter()は必要なことを行うのに役立ちそうです。

于 2011-01-18T17:53:30.627 に答える