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用于此任务似乎不太自然。错误信息是由 引起的aaply,它试图返回一个数组:你可以alply改用;您还需要在某处调用您的函数。

以下是一些惯用的替代方案:

outer( x10, 0:n, `^` )
t(sapply( x10, function(u) u^(0:n) ))
sapply( 0:3, function(k) x10^k )
于 2013-07-08T13:22:30.453 回答
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

请注意,索引a[3]超出范围,因此返回NA(第一列除外,即1)。

于 2013-07-08T22:39:06.413 回答