基于Vectorize函数向量化双参数自协方差函数生成矩阵失败咨询
解决双参数函数向量化生成矩阵的问题
我明白你的问题了——你想用向量化方式生成5×5的协方差矩阵,但Vectorize()只返回了对角线元素,这是因为它的默认行为并非生成所有参数组合,而是按位置一一配对输入参数。
问题根源
当你调用covmatrix(h1 = 1:5, h2 = 1:5)时,Vectorize()只会计算(1,1)、(2,2)……(5,5)这5组同位置的参数配对,自然只能得到对角线元素,而非所有两两组合的结果。
解决方案:使用outer()函数
outer()函数专门用于处理双参数函数的全组合计算,它会遍历第一个参数的每个元素和第二个参数的每个元素,将函数应用到每一组组合上,最终返回矩阵形式的结果,完全符合你的需求,且不需要循环或apply类函数。
修正后的完整代码
首先修正原函数的小问题(补充未定义的n,提前计算均值提升效率),再用outer()生成矩阵:
set.seed(123) # 添加随机种子,保证结果可复现 x <- arima.sim(n = 100, list(ar = 0.5)) n <- length(x) # 定义样本量n # 修正后的协方差函数 cov_fun <- function(h1, h2) { x_mean <- mean(x) # 提前计算均值,避免重复计算 # 计算三个序列的索引 idx_start <- 1:(n - h1 - h2) idx_mid <- (1 + h1):(n - h2) idx_end <- (1 + h1 + h2):n # 按你的逻辑计算协方差值 (1/n) * sum( (x[idx_start] - x_mean) * (x[idx_mid] - x_mean) * (x[idx_end] - x_mean) ) } # 生成5×5的协方差矩阵 cov_matrix <- outer(1:5, 1:5, cov_fun) # 查看结果 print(cov_matrix)
结果说明
运行上述代码后,cov_matrix就是你想要的5×5完整矩阵,行对应h1=1:5的每个值,列对应h2=1:5的每个值,所有两两组合的协方差值都被计算出来了。
内容的提问来源于stack exchange,提问作者mohamed
相关产品推荐
相关产品推荐

