1

この質問は、前の質問のフォローアップです:行操作と組み合わせた列からの最小値(0より大きい)

基本的に、異なる行列 (同じ行/列) の値を使用して、apply の無名関数のパラメーターとして渡す必要があります。

私のコードは

apply(dv, 2, function(y) { y[y>0] <- (y[y>0] - 
                                       blacksch(min(
                                         ifelse(any(y>0), y[y>0], 0)),k,sigma,r,
                                                (min(ifelse(any(y>0), (which(y>0)/steps) *t ,0))))
                                     ); 
                          y })

これは異なるマトリックスからのものであるmin( ifelse(any(y>0), y[y>0], 0))必要がありますがst、dv の値とまったく同じ場所 (行/列単位) にある必要があります。

例として、次の 2 つの行列 dv と st を使用できます。

> dv
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    3
[3,]    0    3    5
> st
     [,1]   [,2]   [,3]
[1,]  100 100.00 100.00
[2,]  100 100.00 102.95
[3,]  100 102.34 104.88

列 2 の値 102.34 を関数の最初のパラメーターに渡す必要がありますblacksch(これは、行列の列 2 の 0 より大きい最小値と同じ位置に対応するため)dv

だから私はこれが正しくないことを知っていますが、次のようなものです:

apply(dv, 2, function(y) { y[y>0] <- (y[y>0] - 
                                           blacksch(st[minimum position of value greater than 0 in dv for each column],k,sigma,r,
                                                    (min(ifelse(any(y>0), (which(y>0)/steps) *t ,0))))
                                         ); 
                              y })

からの最小値だけでなくst、「現在の」値も必要であることにも言及する必要があると思います(これをループで記述する場合は、ネストされた for ループに似たようなことを行います)

私の解決策は、実際には R の方法ではありません (したがって、パフォーマンスが低下します)。

for(j in 1:paths)
{
  minrow=0
  for(i in 1:steps)
  {
    if (dv[i,j]>0 && minrow==0)
    {
      minrow=i
      bsminrow=blacksch(st[i,j],k,sigma,r, i/steps * t)
    }
    else if (minrow!=0)
    {
      dv[i,j]=blacksch(st[i,j],k,sigma,r,i/steps* t ) - bsminrow
    }
  }
}
4

2 に答える 2

1

たとえば、列をループするようにapply変更できます。sapply

sapply(1:ncol(dv), function(y) {       
               h <- st[,y]                ## y is column number     
               y <- dv[,y]                ## y is column now
               st.par <- ifelse(any(y)> 0,
                 h[head(which(y[order(y)] >0),1)], ## I order here to and I choose the first one
                                                   ## > 0
               h[1])
               st.par
               ###.....   here you call your custom function
               ###blacksch(st.par,...)
})

1] 100.00 102.34 102.95
于 2013-02-18T07:30:25.570 に答える