- 2次元プロットの分布を扱っている
- KernSmoothパッケージ(今はデフォルトで入る?)のbkde2D()関数でカーネル平滑化ができる
- その処理の中身をbkde2D()関数のソースに沿って確認しようと思ったら、中で使っているlinbin2D()という関数が「読めません」ととまった
- このlinbin2D()は、2次元格子のセルごとに点の個数を数える関数なのだが、RでのFortranの関数を呼び出しているようだ
- 中身はこう
function (X, gpoints1, gpoints2)
{
n <- nrow(X)
X <- c(X[, 1L], X[, 2L])
M1 <- length(gpoints1)
M2 <- length(gpoints2)
a1 <- gpoints1[1L]
a2 <- gpoints2[1L]
b1 <- gpoints1[M1]
b2 <- gpoints2[M2]
out <- .Fortran(F_lbtwod, as.double(X), as.integer(n), as.double(a1),
as.double(a2), as.double(b1), as.double(b2), as.integer(M1),
as.integer(M2), double(M1 * M2))
matrix(out[[9L]], M1, M2)
}
<environment: namespace:KernSmooth>
- linbin2Dオブジェクトに、この内容の関数を入れるために実行したコマンドがget()函数を用いた、こちら
linbin2D <- get("linbin2D", envir=environment(bkde2D))
- この方法を見つけたネット上のサイトがこちら
- get()関数はそのヘルプ記事を見るとオブジェクトの中身を取り出す関数らしい。これでも出る
get("linbin2D")
- ちなみにlinbin.f,linbin2D.fのソースはそれぞれこちらとこちら
subroutine linbin(X,n,a,b,M,trun,gcnts)
double precision X(*),a,b,gcnts(*),lxi,delta,rem
integer n,M,i,li,trun
do 10 i=1,M
gcnts(i) = dble(0)
10 continue
delta = (b-a)/(M-1)
do 20 i=1,n
lxi = ((X(i)-a)/delta) + 1
li = int(lxi)
rem = lxi - li
if (li.ge.1.and.li.lt.M) then
gcnts(li) = gcnts(li) + (1-rem)
gcnts(li+1) = gcnts(li+1) + rem
endif
if (li.lt.1.and.trun.eq.0) then
gcnts(1) = gcnts(1) + 1
endif
if (li.ge.M.and.trun.eq.0) then
gcnts(M) = gcnts(M) + 1
endif
20 continue
return
end
subroutine lbtwod(X,n,a1,a2,b1,b2,M1,M2,gcnts)
integer n,M1,M2,i,li1,li2,ind1,ind2,ind3,ind4
double precision X(*),a1,a2,b1,b2,gcnts(*)
double precision lxi1,lxi2,delta1,delta2,rem1,rem2
do 10 i = 1,(M1*M2)
gcnts(i) = dble(0)
10 continue
delta1 = (b1 - a1)/(M1 - 1)
delta2 = (b2 - a2)/(M2 - 1)
do 20 i = 1,n
lxi1 = ((X(i) - a1)/delta1) + 1
lxi2 = ((X(n+i) - a2)/delta2) + 1
li1 = int(lxi1)
li2 = int(lxi2)
rem1 = lxi1 - li1
rem2 = lxi2 - li2
if (li1.ge.1) then
if (li2.ge.1) then
if (li1.lt.M1) then
if (li2.lt.M2) then
ind1 = M1*(li2-1) + li1
ind2 = M1*(li2-1) + li1 + 1
ind3 = M1*li2 + li1
ind4 = M1*li2 + li1 + 1
gcnts(ind1) = gcnts(ind1)+(1-rem1)*(1-rem2)
gcnts(ind2) = gcnts(ind2)+rem1*(1-rem2)
gcnts(ind3) = gcnts(ind3)+(1-rem1)*rem2
gcnts(ind4) = gcnts(ind4)+rem1*rem2
endif
endif
endif
endif
20 continue
return
end