APL中如何用更少WSSIZE重新生成协方差矩阵长视图?
解决APL协方差矩阵长视图生成的内存溢出问题
你的代码中rfikv∘.,rfikv会生成一个n×n的嵌套数组(n=4500时共2025万个嵌套向量),嵌套结构和完整方阵的存储开销直接导致了WSFULL错误。以下是两种优化方案,均避免生成完整配对方阵,直接按需生成所需的下三角数据:
方案一:基于索引掩码提取(简洁易读)
利用原有的下三角掩码lx,直接从二维索引矩阵中筛选出符合条件的(i,j)对,再生成对应的id配对和协方差值:
covm←0.5×((5 5⍴⍳25)+⍉(5 5⍴⍳25)) rfikv←101 102 103 104 105 n←⊃⍴covm lx←,(⍳n)∘.≤⍳n # 提取下三角对应的行、列索引对 idx←⍉(,⍳n n)[lx;] # 生成id配对矩阵(m×2,m为下三角元素数) rf_pairs←↑rfikv[idx[1;]] , rfikv[idx[2;]] # 提取对应的协方差值 cov_vals←covm[lx] # 合并为长视图 long_view←rf_pairs , cov_vals
方案二:直接生成索引序列(内存更高效)
跳过完整索引矩阵的生成,直接构造下三角对应的i、j序列,进一步降低内存占用:
covm←0.5×((5 5⍴⍳25)+⍉(5 5⍴⍳25)) rfikv←101 102 103 104 105 n←⊃⍴covm # 计算每个i对应的j的数量 counts←n-⍳n+1 # 生成i序列:每个i重复counts[i]次 i←,∊(⍳n)∘.⍴counts # 生成j序列:每个i对应的j从i到n j←,∊(⍳n)∘.{⍵+⍳(n-⍵+1)} # 生成id配对和协方差值,合并为长视图 long_view←↑rfikv[i] , rfikv[j] , covm[(⍳n)∘.≤⍳n]
效果说明
两种方案均只生成下三角所需的m=(n(n+1))/2条数据(n=4500时约1012万条),避免了完整方阵的存储开销,嵌套结构也被替换为普通二维数组,内存占用大幅降低,可解决WSFULL问题。
内容的提问来源于stack exchange,提问作者Yuliia Serhiienko
相关产品推荐
相关产品推荐

