Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab:通过排列构建分子库_Matlab - Fatal编程技术网

Matlab:通过排列构建分子库

Matlab:通过排列构建分子库,matlab,Matlab,我试图用0-46氢、0-20碳、0-13氧等所有可能的分子制作一个索引。我感兴趣的有7个原子:H、C、O、N、Cl、F和S。我写了以下for循环来展示我试图实现的目标: MassListIndex = [] %MassIndex = [h,c,o,n,cl,f,s] for h = 0:46; for c = 0:20; for o = 0:13; for n = 0:15; for cl=0:5; for f=

我试图用0-46氢、0-20碳、0-13氧等所有可能的分子制作一个索引。我感兴趣的有7个原子:H、C、O、N、Cl、F和S。我写了以下for循环来展示我试图实现的目标:

MassListIndex = []
%MassIndex = [h,c,o,n,cl,f,s]
for h = 0:46;
  for c = 0:20;
    for o = 0:13;
        for n = 0:15;
            for cl=0:5;
                for f=0:5;
                    for s=0:5;
                        MassListIndex = [MassListIndex;[h,c,o,n,cl,f,s]];
                    end;
                end;
            end;
        end;
    end;
end;
end;
这让我觉得效率极低;我不想等上两个月才开始运行。我尝试过使用combinator.m脚本,但问题是对于“置换”的集合长度,只有一个输入,即如果我想要有多达46个氢,我还需要另外6个原子中的每一个都有46个。这在计算上…很重(46^7~=4360亿)

有没有办法使这种计算更有效?还是我需要更多地考虑通过“无意义排列”来缩小我的列表(据我所知,H40C2分子从未被观察到!)


谢谢

第一个问题没那么难。如果你记得预先分配,至少不会! 我将代码更改为:

mxidx = 47*21*14*16*6*6*6;
MassListIndex = zeros(mxidx,7);
idx = 1;
for h = 0:46;
    for c = 0:20;
        for o = 0:13;
            for n = 0:15;
                for cl=0:5;
                    for f=0:5;
                        for s=0:5;
                            MassListIndex(idx,:) = [h,c,o,n,cl,f,s];
                            idx = idx + 1;
                        end;
                    end;
                end;
            end;
        end;
    end;
end;
它在我的电脑上运行了不到一分钟。 通常,如果您忘记预先分配,Matlab会警告您;无论何时(就像在本例中)预先知道矩阵的大小,都应该预先分配

另一方面,另一个问题是47^7=506623120463(超过5000亿-它是47^7而不是46^7,因为列表0:46有47个元素)。所以,即使在矩阵中只使用一个字节的pr.行(当然不会),它仍然会占用超过半TB的空间!而且计算时间也将是巨大的

但实际上,你什么时候会需要这份清单呢。通过构建列表的方式,您可以轻松地通过索引计算条目,例如:

function m = MassListIndex(a,b)
a = a - 1;
lst = zeros(1,7);
for i = 1:7
    lst(8-i) = mod(a,47);
    a = floor(a /47);
end
if nargin < 2
    m = lst;
else
    m = lst(b);
end
end
群众资料来源:


免责声明:我不太擅长化学,所以请应用合理数量的怀疑

你是在寻找经验公式吗?因为对于结构公式,如果有足够的RAM,它会变得更加复杂,定义
vectors={0:46 0:20 0:13 0:15 0:5 0:5 0:5 0:5}并应用。或者要保存RAM,请尝试使用
uint8
数据类型:
vectors={uint8(0:46)uint8(0:20)uint8(0:13)uint8(0:15)uint8(0:5)uint8(0:5)uint8(0:5)}
。后者在我的计算机上只需5秒钟,就可以生成所需的47755008x7,结果经验公式对质量很重要,因此,如果你将47755008x7矩阵和
bsxfun
中的原子质量值结合起来,你就得到了答案。
无意义排列的算法是。@pootershecat请告诉我我是否正确理解了你的问题(在这种情况下,我在上一篇评论中链接的代码在大约5秒钟内生成所有组合),这样我就可以将问题标记为duplicate@Mendo:没有结构,那太疯狂了!谢谢你的回复!列出该列表的原因是为了计算每个排列的质量。该质量清单与HD质谱数据进行比较,因此我们可以确定检测到的化合物的分子式。这有意义吗?我已经在我的答案中添加了一个编辑,解释了如何从排列数中获得质量,而不制作列表。如果你坚持要列一个清单,那么就没有办法避免花费大量的内存,我也看不到有任何办法可以显著加快这个过程(可能有一个——我就是看不到)。
function mass = getMassFromPermutationNumber(a)
a = a - 1;
lst = zeros(1,7);
for i = 1:7
    lst(8-i) = mod(a,47);
    a = floor(a /47);
end
mass = lst*[1.00794;12.011;15.9994;20.1797;35.4527;18.9984;32.066];
end