0

仮定しましょう

x = c(1, 2, 3.5, 4, 6, 7.5, 8, 9, 10, 11.5, 12) 
y = c(2.5, 6.5) 
I = split(x, findInterval(x, y))
f = function(I$'i', x) {
        d = pmax(outer(x, I$'i', "-"), 0)
        colSums(d - d^2/2)
}

各間隔の各値で f(I$'i', x) の値を計算し、どの I$'i' 実際の値が f(I$'i', x ) の最大値を持つかを調べたい各間隔。たとえば、3 つの interval がある場合、結果は x の 3 つの値で、各区間で f(I$'i', x) が最大になります。これらの値を見つけるにはどうすればよいですか? さらに、コードの反復ごとにベクトル y の値が変化することに注意してください。

私はこのコードを書きましたが、各間隔の最大値の実際の値を見つけることができません:

for(i in 0:length(I)-1){
    max.value = I$'i'[which.max(f(I$'i', x))]
}

そして、私はこのエラーを受け取りました: pmax(outer(x, I, "-"), 0) のエラー: 長さ 0 のベクトルを他のベクトルと混合することはできません

4

1 に答える 1

0

i問題は、リストの th 要素にインデックスを付けようとしていることです。存在しない string に対応I$'i'するリストの要素を取得しようとしています:'i'

> i <- 1
> I$'i'
NULL

これを修正するには、次の[[..]]表記法を使用してリストにインデックスを付ける必要があります (つまり、順番にインデックスを付けますI[[1]]= I$'0')。

> i <- 1
> I[[i]]
[1] 1 2
> I$'0' # to illustrate the indexing
[1] 1 2

fが ( へのインデックスではなく) ベクトルを取得することだけを意図していると仮定するとI、その定義は次のようになります。

f = function(vec, x) {
        d = pmax(outer(x, vec, "-"), 0)
        colSums(d - d^2/2)
}

そして、次のようなループ:

for (i in 1:length(i)) {
     max.value = I[[i]][which.max(f(I[[i]], x))]
}

リストの要素を直接反復できることに注意してください。各要素に個別にインデックスを付ける必要はないため、次のこともできます。

for (vec in I) {
     max.value = vec[which.max(f(vec, x))]
}

max.value(また、各ループで上書きされるため、持っているものとは少し異なるものが必要になる場合があります。)

于 2012-04-30T11:16:05.753 に答える