除了注解之外,我从下面的代码开始:
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
型
1条答案
按热度按时间j9per5c41#
下面是一个向量化的形式,它不使用任何for循环来计算结果:
字符串
然而,代码中的主要问题是,在使用矩阵
eI
和eT
之前,您没有预先分配它们:型