张量与向量协方差计算后my_cov仍全零的问题求助
协方差计算全零结果的排查与解决
问题背景
现有维度为(L, L, H)的张量ppa(其中Area = L*L,H为时间序列步数),以及长度为H的向量naut,需计算张量中各区域时间序列与naut的协方差,但运行代码后my_cov始终为全零矩阵,循环赋值未生效。
原代码核心错误点
- 变量名拼写错误:第一行重塑时误用了
paut而非输入张量名ppa,导致后续计算用的是错误的张量数据,大概率是未定义的空值或全零值。 - 循环范围错误:原代码循环
for i=1:H,但重塑后的ppa是(H, Area)维度(共Area列,对应Area个区域),循环应该遍历1:Area而非1:H,导致仅给my_cov的前H个元素赋值,剩余元素保持初始零值;若Area<H还会触发索引越界。 - 逻辑匹配错误:循环遍历的对象是区域列(共
Area个),但索引范围对应时间步数H,完全不匹配,导致赋值逻辑失效。
修正后的完整代码
步骤1:正确重塑张量与初始化
Area = L * L; % 将(L,L,H)张量重塑为(H, Area),每列对应一个区域的H步时间序列 ppa_reshaped = reshape(ppa, Area, H)'; Naut = naut'; % 转置为列向量,与时间序列维度匹配 my_cov = zeros(Area, 1); % 初始化对应Area个区域的协方差向量
步骤2:循环计算每个区域的协方差
for i = 1:Area % 计算第i个区域时间序列与Naut的协方差矩阵 cov_tmp = cov(ppa_reshaped(:, i), Naut); % 提取协方差元素(协方差矩阵的(1,2)与(2,1)值相等) my_cov(i) = cov_tmp(1, 2); end
步骤3:重塑为二维矩阵
my_cov = reshape(my_cov, L, L);
额外排查建议
- 先验证原始数据:检查
ppa和naut是否存在全零、无波动(所有值相同)的情况,若数据本身方差为0,协方差必然为0。 - 单独测试单列计算:执行
cov(ppa_reshaped(:,1), Naut)查看结果,确认数据是否正常、协方差计算逻辑是否生效。
内容的提问来源于stack exchange,提问作者Giacomo Giuliani
相关产品推荐
相关产品推荐

