正好我前一段时间也写过一个调和曲线图的R函数,发出来分享一下:
andrews.curve = function(x, n = 101, type = "l", lty = 1,
lwd = 1, pch = NA, xlab = "t", ylab = "f(t)", ...) {
p = ncol(x)
if (is.null(p))
stop("'x' must be a matrix or data.frame!")
if (p < 1)
stop("'x' must have at least one column!")
theta = matrix(seq(-pi, pi, length.out = n), nrow = n, ncol = 1)
if (p == 1) {
a = matrix(x/sqrt(2), nrow = n, ncol = nrow(x), byrow = TRUE)
}
if (p > 1) {
b = matrix(rep(1:(p/2), each = 2, length.out = p - 1),
nrow = 1, ncol = p - 1)
a = cbind(1/sqrt(2), sin(theta %*% b + matrix(rep(c(0,
pi/2), length.out = p - 1), nrow = n, ncol = p -
1, byrow = TRUE))) %*% t(x)
}
matplot(theta, a, type = type, lty = lty, lwd = lwd, pch = pch,
xlab = xlab, ylab = ylab, ...)
}
里面都是以矩阵的形式做的运算,不过我没有测试,不知道速度会不会快一些。
对于调和曲线图,观测[latex]X_i[/latex]和[latex]X_j[/latex]的欧式距离正好是曲线垂直距离的积分,这是数学性质和图形性质能够结合的关键。