matlab - 提高数组内搜索效率的其他方法

问题描述 投票:0回答:1

我从这段代码开始,除了注释:

mol1...;mol2...;
r1 = size(e, 1);%number of candidates for aligned amino acid
r0 = size(e0,1);%number of candidates for reference amino acid
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);%number of atoms matched
                    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 是一些关于几何的数字。

当我获得更多原子时,数组的大小可以是 200 000。 我认为丢失少于 5 个原子的组合不会有什么坏处,但代码并没有运行得更快。 所以问题出在“如果”上。 接下来我尝试删除组合<5, keep the indexes and rebuild the initial array afterwards:

e (:, 7) = find(e (:, 1));
e0(:, 7) = find(e0(:, 1));
e (e (:, 4) < 5, :) = [];
e0(e0(:, 4) < 5, :) = [];
...

这使时间减半。 我 tic-toc-ed 了 500 行代码,问题就在这里。 300 个分子(我到目前为止已经选择)需要 2 年时间,我想再添加一些(20000 个)。

那么你们还能想到什么其他方法来刮擦我的数组中的原子呢? 也许我应该决定分子的每种大小(15 个原子可以废弃 5 个原子的结果;8-4)。 如果改变精度会减少这个时间,我该怎么做?

谢谢!

arrays matlab if-statement search
1个回答
0
投票

这是一个向量化形式,无需任何 for 循环即可计算结果:

e_eq_e0 = e(:, 1) == e0(:, 1).';

eI = e_eq_e0 .* e(:, 1);
eT = e_eq_e0 .* abs((e(:, 2) ./ e0(:, 2).'  - 1) * 100);

但是代码中的主要问题是在使用矩阵

eI
eT
之前没有预先分配它们:

eI = zeros(r1, r0);
eT = zeros(r1, r0);
for i = 1 : r1
....
© www.soinside.com 2019 - 2024. All rights reserved.