如何向量化接收向量的函数?R中Rastrigin等高线绘制求助
问题分析与解决方案
首先,咱们来拆解你遇到的两个核心问题:向量函数的向量化调用,以及Rastrigin函数等高线图的正确绘制。
你的代码为什么出错?
- 向量拼接的逻辑错误:你用
c(x,y)把两个长度为100的序列拼接成了一个长度200的向量,而TF_rastrigin()会把这个长向量当成100维空间里的单个点(因为Rastrigin函数的维度由输入向量的长度决定),所以它只会返回一个单一的数值。这就导致你的tibble里value列只有1个值,而x和y各有100个值,长度不匹配,ggplot自然无法正确映射数据。 - 网格数据的生成方式不对:你需要的是二维空间中所有
(x,y)点的组合,而不是让x和y各自独立成序列。
优化后的代码方案
我们可以利用TestFunctions包支持矩阵输入的特性(每一行代表一个二维点),高效计算所有网格点的Rastrigin值:
# 安装并加载所需包 install.packages("TestFunctions") library(TestFunctions) library(tidyverse) # 整合tidyverse工具,包括ggplot2、dplyr、tidyr等 # 设置网格密度和Rastrigin函数的标准取值范围[-5.12, 5.12] dim <- 100 x_seq <- seq(-5.12, 5.12, length.out = dim) y_seq <- seq(-5.12, 5.12, length.out = dim) # 生成所有(x,y)组合,并计算每个点的Rastrigin值 mw <- crossing(x = x_seq, y = y_seq) %>% mutate(value = TF_rastrigin(cbind(x, y))) # 绘制等高线图+热力图 ggplot(mw, aes(x = x, y = y)) + geom_raster(aes(fill = value)) + geom_contour(color = "white", linewidth = 0.5) + # 白色等高线更清晰 scale_fill_viridis_c(option = "plasma") + # 用viridis色系,色彩友好且区分度高 labs(title = "Rastrigin函数等高线图", x = "X轴", y = "Y轴", fill = "函数值") + theme_minimal()
补充说明
- 向量化调用的思路:对于接收向量的函数,若要批量计算多个点的函数值,优先用矩阵输入(每行一个点),这比循环或
rowwise()逐个计算高效得多。如果函数不支持矩阵输入,再考虑用purrr包的pmap()等工具批量处理。 - 备选低效但直观的方式:如果你想更直观地看到逐个点的计算过程,可以用
rowwise()(但对于100x100的网格,效率会低一些):
mw <- crossing(x = x_seq, y = y_seq) %>% rowwise() %>% mutate(value = TF_rastrigin(c(x, y))) %>% ungroup()
内容的提问来源于stack exchange,提问作者Troels Larsen
相关产品推荐
相关产品推荐

