Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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_Sorting_Find - Fatal编程技术网

MATLAB中查找和排序的快速替代方法

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)];

我正在使用遗传算法进行社区检测。社区以基于位点的表示法表示,即每个指数(基因)及其值都在同一个社区中

例如,在下图中,如果染色体是(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)];%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
查看方法的结果是否相等。