如何编写分母求和?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
相关产品推荐
相关产品推荐

