大规模分子数据数组高效搜索优化方案求助
分子原子组合数据处理的性能优化需求
初始实现与性能瓶颈
最初处理分子原子组合数据的代码如下:
mol1...;mol2...; r1 = size(e, 1);% 待比对氨基酸的候选数 r0 = size(e0,1);% 参考氨基酸的候选数 for i = 1 : r1 %if e(i, 1) > 4 for j = 1 : r0 %if e0(j, 1) > 4 if e(i, 1) == e0(j, 1) eI(i, j) = e(i, 1);% 匹配的原子数量 eT(i, j) = abs((e(i, 2) - e0(j, 2)) / e0(j, 2) * 100); end %end end %end end
其中mol1和mol2代表原子选择组合及总数(例如3原子分子的组合为(1,1,0,0)、(1,0,1,0)…(3,1,1,1)),e和e0为几何相关数值。
当数组规模达到20万时,计算效率极低。尝试过滤原子数<5的组合,但未带来性能提升——问题根源在条件判断环节。后续通过删除原子数<5的组合并保留索引重构数组,计算时间减半,但处理300个分子仍需2年,而计划要扩展到20000个分子。
当前优化版本(版本3,较版本2快50倍)
e(:,7)=find(e (:, 1)); e0(:,7)=find(e0 (:, 1)); [val,ia,ib]=intersect(e(:, 1), e0(:, 1)); for i = 1 : size(ia) for j = 1 : size(ib) eI(e(ia(i), 7), e0(ib(j), 7)) = e(ia(i), 1); eT(e(ia(i), 7), e0(ib(j), 7)) = abs((e(ia(i), 2) - e0(ib(j), 2)) / e0(ib(j), 2) * 100); end end
(注:修正了原代码中e0(ib(j), )的语法错误,补全为e0(ib(j), 2))
需求方向
- 更高效的数组内原子筛选方法
- 是否可根据分子规模制定筛选规则(例如15原子分子过滤5原子结果)
- 如何通过调整计算精度缩短运行时间
内容的提问来源于stack exchange,提问作者Joita Dan
相关产品推荐
相关产品推荐

