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

如何编写分母求和?R语言GOE矩阵相关函数实现疑问

实现目标函数的分母部分解决方案

1. 前期代码回顾

采样GOE随机矩阵及特征值/特征向量

n <- 2000

# 采样GOE随机矩阵
A <- matrix(rnorm(n*n, mean=0, sd=1), n, n) 
G <- (A + t(A))/sqrt(2*n)
ev <- eigen(G)
l <- ev$values
v <- ev$vectors

生成球面上均匀分布的随机向量

# 多元分布参数
mean <- rep(0, n) 
var <- diag(n)

# 设置随机种子保证结果可复现
set.seed(101)

# 模拟多元正态分布样本
initial <- mvrnorm(n=10, mu=mean, Sigma=var)

# 归一化得到球面上均匀分布的随机向量x_0
x_0 <- initial[1, ]/norm(initial[1, ], type="2") 

注:x_0是球面上均匀分布的随机向量,v的每一列是上述GOE矩阵的特征向量。

2. 目标函数实现

目标函数形式如下:
目标函数

针对分母编写的疑问,这里给出高效实现方式(利用R矩阵运算特性,避免低效循环):

# 提前计算x0与所有特征向量的内积,得到长度为n的向量
x0_v_inner <- x_0 %*% v

# 定义目标函数h1
h1 <- function(t) {
  # 计算分子:x0与第n个特征向量的内积绝对值 * exp(-2*l[n]*t)
  numerator <- abs(x0_v_inner[n]) * exp(-2*l[n]*t)
  # 计算分母的求和项:每个内积平方 * 对应指数项,再求和
  denom_sum <- sum( (x0_v_inner)^2 * exp(-2*l*t) )
  # 返回最终结果
  numerator / sqrt(denom_sum)
}

关键细节说明

  • x_0 %*% v会一次性完成x₀与v所有列(特征向量)的内积计算,得到长度为n的向量,对于n=2000的场景,比循环遍历每个i效率高很多
  • (x0_v_inner)^2 * exp(-2*l*t)是逐元素运算:每个内积的平方乘以对应特征值的指数项,再用sum()得到分母的求和结果
  • 如果需要多次调用h1函数,把x0_v_inner的计算放在函数外可以避免重复运算,进一步提升效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:30:44