You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向量化接收向量的函数?R中Rastrigin等高线绘制求助

问题分析与解决方案

首先,咱们来拆解你遇到的两个核心问题:向量函数的向量化调用,以及Rastrigin函数等高线图的正确绘制。

你的代码为什么出错?

  1. 向量拼接的逻辑错误:你用c(x,y)把两个长度为100的序列拼接成了一个长度200的向量,而TF_rastrigin()会把这个长向量当成100维空间里的单个点(因为Rastrigin函数的维度由输入向量的长度决定),所以它只会返回一个单一的数值。这就导致你的tibble里value列只有1个值,而x和y各有100个值,长度不匹配,ggplot自然无法正确映射数据。
  2. 网格数据的生成方式不对:你需要的是二维空间中所有(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:52:51