2

R での関数型プログラミングの感触をつかみたいと思います。その趣旨で、いくつかの構造を含む可能性があるので、ヴァンデルモンド行列計算を書きたいと思います。

命令スタイルでは次のようになります。

vandermonde.direct <- function (alpha, n) 
{
  if (!is.vector(alpha))  stop("argument alpha is not a vector")
  if (!is.numeric(alpha)) stop("argument n is not a numeric vector")
  m <- length(alpha)
  V <- matrix(0, nrow = m, ncol = n)
  V[, 1] <- rep(1, m)
  j <- 2
  while (j <= n) {
    V[, j] <- alpha^(j - 1)
    j <- j + 1
  }
  return(V)
}

関数型スタイルで R でエレガントに書くにはどうすればよいでしょうか。

以下は機能しません:

x10 <- runif(10)
n <- 3
Reduce(cbind, aaply(seq_len(n-1),1, function (i) { function (x) {x**i}}), matrix(1,length(x10),1))

関数に移動するError: Results must have one or more dimensions.関数のリストについて教えてくれるようにi in seq_len(3-1)x -> x**i.

4

3 に答える 3

2

ここにありReduceます:

m <- as.data.frame(Reduce(f=function(left, right) left * x10, 
                          x=1:(n-1), init=rep(1,length(x10)), accumulate=TRUE))
names(m) <- 1:n - 1
于 2013-07-08T15:49:10.347 に答える
1

R の環境機能を使用する別のオプションを次に示します。

vdm <- function(a)
{
    function(i, j) a[i]^(j-1)
}

これは任意n(列数) で機能します。

与えられた の「Vandermonde汎関数」を作成するには、次aを使用します。

v <- vdm(a=c(10,100))

マトリックスを一度に作成するには、次を使用します。

> outer(1:3, 1:4, v)
     [,1] [,2]  [,3]  [,4]
[1,]    1   10   100 1e+03
[2,]    1  100 10000 1e+06
[3,]    1   NA    NA    NA

indexa[3]は範囲外であるため、返されることに注意してくださいNA(最初の列である を除く1)。

于 2013-07-08T22:39:06.413 に答える