matlab 在数组中高效搜索的其他方法

9rygscc1  于 6个月前  发布在  Matlab
关注(0)|答案(1)|浏览(84)

除了注解之外,我从下面的代码开始:

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

字符串
mol 1和mol 2是选择原子和总数的组合:ex表示3原子分子(1,1,0,0)(1,0,1,0).(3,1,1,1)。e和e0是关于几何形状的一些数字。
当我得到更多的原子时,数组的大小可以是200 000。我认为丢失少于5个原子的组合不会有什么坏处,但代码运行得并不快。所以问题在于ifs。接下来我尝试删除<5个原子的组合,保留索引并在之后重建初始数组:

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


这就节省了一半的时间。我对500行的代码进行了滴答滴答的测试,问题就在这里。300个分子(我到现在为止选择的)需要2年的时间,我想再加一些(20000)。
那么,你们还能想到什么其他的方法来刮除我的数组中的原子呢?也许我应该为每个大小的分子决定(15个原子可以刮除5个原子的结果; 8-4)。如果改变精度会减少这个时间,我应该怎么做?
版本2:无法提交-网页不允许-请参阅评论
版本3(比v2快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), )) / e0(ib(j), 2) * 100);
end
end

j9per5c4

j9per5c41#

下面是一个向量化的形式,它不使用任何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);

字符串
然而,代码中的主要问题是,在使用矩阵eIeT之前,您没有预先分配它们:

eI = zeros(r1, r0);
eT = zeros(r1, r0);
for i = 1 : r1
....

相关问题