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

如何在R语言中计算n维数据数组的梯度

需求:任意n维数组的中心差分梯度计算工具

我认为肯定有现成的R包函数,但始终找不到能对**数据点数组(非函数)**通过中心差分计算梯度的工具,要求能处理所有非边缘点,且支持任意n维数据集。

示例:3维网格点的梯度计算

下面是生成5x5x5网格数据点,并计算(3,3,3)点梯度的示例:

response_data <- array(NA, dim = c(5,5,5))
for(i in 1:dim(response_data)[1]) {
  for(j in 1:dim(response_data)[2]) {
    for(k in 1:dim(response_data)[3]) {
      response_data[i,j,k] <- i*j*k
    }
  }
}
  
x_values <- 1:5
y_values <- 1:5
z_values <- 1:5

# 计算(3,3,3)点的中心差分梯度
partial_x <- (response_data[4, 3, 3] - response_data[2, 3, 3])/
  (x_values[4] - x_values[2])
partial_y <- (response_data[3, 4, 3] - response_data[3, 2, 3])/
  (y_values[4] - y_values[2])
partial_z <- (response_data[3, 3, 4] - response_data[3, 3, 2])/
  (z_values[4] - z_values[2])

已有尝试与局限

  • 编辑1:pracma::gradient可处理1维或2维数组,但不支持n维数组。
  • 编辑2:我自己编写了3维数组的梯度计算代码,但想优化为支持任意n维的版本,目前卡在如何动态选择维度进行循环:
response_data <- array(NA, dim = c(5,5,5))
for(i in 1:dim(response_data)[1]) {
  for(j in 1:dim(response_data)[2]) {
    for(k in 1:dim(response_data)[3]) {
      response_data[i,j,k] <- i*j*k
    }
  }
}

# 将所有坐标存入列表
coord_vals <- list(x_values = 1:5, y_values = 1:5, z_values = 1:5)

# 创建空数组存储偏导数,每个元素对应一个自变量的偏导
pds <- rep(list(array(NA, dim = sapply(coord_vals, length))),
           length(coord_vals))
names(pds) <- names(coord_vals)

# 计算梯度:第一维度
dimension <- 1
for(j in 1:length(coord_vals[[2]])) {
  for(k in 1:length(coord_vals[[3]])) {
    pds[[dimension]][ , j, k] <- 
      pracma::gradient(F = response_data[, j, k],
                       h1 = coord_vals[[dimension]])
  }
}
# 第二维度
dimension <- 2
for(i in 1:length(coord_vals[[1]])) {
  for(k in 1:length(coord_vals[[3]])) {
    pds[[dimension]][i, , k] <- 
      pracma::gradient(F = response_data[i, , k],
                       h1 = coord_vals[[dimension]])
  }
}
# 第三维度
dimension <- 3
for(i in 1:length(coord_vals[[1]])) {
  for(j in 1:length(coord_vals[[2]])) {
    pds[[dimension]][i, j, ] <- 
      pracma::gradient(F = response_data[i, j, ],
                       h1 = coord_vals[[dimension]])
  }
}

内容的提问来源于stack exchange,提问作者mikeblazanin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:42:07