MATLAB中查找和排序的快速替代方法
我正在使用遗传算法进行社区检测。社区以基于位点的表示法表示,即每个指数(基因)及其值都在同一个社区中 例如,在下图中,如果染色体是(b),则群落将是(d) 因此,要从染色体中提取社区,我需要迭代查找索引和值,为此,我编写了以下代码:MATLAB中查找和排序的快速替代方法,matlab,sorting,find,Matlab,Sorting,Find,我正在使用遗传算法进行社区检测。社区以基于位点的表示法表示,即每个指数(基因)及其值都在同一个社区中 例如,在下图中,如果染色体是(b),则群落将是(d) 因此,要从染色体中提取社区,我需要迭代查找索引和值,为此,我编写了以下代码: while (SumComms)~=nVar j=find(Sol>0,1,'first');%find the first node which has not placed in any community Com=[j,Sol(j)];
while (SumComms)~=nVar
j=find(Sol>0,1,'first');%find the first node which has not placed in any community
Com=[j,Sol(j)];%index of the node and it's value
Comsize=0;
while Comsize<numel(Com)
Comsize=numel(Com);
x=find(ismembc(Sol,sort([Com,Sol(Com)])));%Indexes which Com occure in Sol
Com=unique([Com,x,Sol(x)]);
end
Sol(Com)=0;
i=i+1;
SumComms=SumComms+numel(Com);
Communities{i}=Com;
end
while(SumComms)~=nVar
j=查找(Sol>0,1,'first');%查找尚未放置在任何社区中的第一个节点
Com=[j,Sol(j)];%节点的索引及其值
Comsize=0;
而Comsize则是使用逻辑向量的解决方案。我们可以将Com
定义为逻辑向量,而不是对索引进行操作,因此对ismember
等索引的操作可以简化为索引操作:
i=0;
SumComms=0;
nVar = 9;
Sol = [3 0 3 1 5 6 4 7 7]+1;
while SumComms ~= nVar
j=find(Sol>1,1,'first');
Com = false(1,nVar);
Com([j Sol(j)])=true;
Comsize=0;
sumcom = 2;
while Comsize<sumcom
Comsize=sum(Com);
Com(Sol(Com))=true;
Com = Com(Sol);
Com(Sol(Com))=true;
sumcom = sum(Com);
end
Sol(Com)=1;
i = i + 1;
SumComms=SumComms+sumcom;
Communities{i}=find(Com);
end
i=0;
SumComms=0;
nVar=9;
溶胶=[3 0 3 1 5 6 4 7 7]+1;
而SumComms~=nVar
j=查找(Sol>1,1,'first');
Com=假(1,nVar);
Com([j Sol(j)])=真;
Comsize=0;
sumcom=2;
ComSizeEyes时,会为我显示您的图像。请提供SumComms
、nVar
和Sol
开头部分的示例,并提供和解释这些变量的输出结果SumCumms
是群集节点数,nVar
是节点总数,因此,终止条件是,而(sumcoms)~=nVar
,换句话说,直到所有节点都放置在一个社区中,循环才会运行Sol
是脉络膜体,例如在图像中,Sol
是基因型,nVar
是9(0到8)。而且sumcoms
在循环中增长,直到9,(nVar
)@SardarUsama,一个数字数组。(代表基因)谢谢你的解决方案,但我测试了这个,我的函数运行速度快了10%,你如何运行速度快了10倍?我用的是Matlab2017a,你认为倍频程快吗?还有一件事,在我的数据中,一些节点可以是空的,它们的值是-1,我的代码就是这样工作的,我如何改变你的代码来处理负值?例如:Sol=[3 0 3 1 5 6 4 7-1]
我用随机数据测试了它,例如nVar=1000;Sol=randi(nVar,1,nVar)代码>。您可以上传您的数据,以便我们进行测试。通常MATLAB比倍频程快。您应该将1
添加到值Sol=[3 0 3 1 5 6 4 7 7-1]+1
中,这里的空值将是0
。考虑改变函数的这些部分:<代码> j=查找(SOL*1,1,‘第一’);<代码>和Sol(Com)=1代码>。下面是一个示例。您可以看到,我的方法快了近7倍。我使用了ismember
,因为八度音阶没有ismembc
。您可以测试这两种方法,并使用isequal
查看方法的结果是否相等。