在matlab中改进生长细胞阵列

时间:2014-04-29 02:03:36

标签: arrays matlab cluster-analysis

我想知道如何有效地运行我的程序的这一部分。基本上为了我的目标,我想集中点。有大约10,000点。这些点已计算出#34; force"它们之间存储在矩阵F中。所以第1点和第2点之间的力是F(1,2)。然后我想和#34;聚集点"如果有足够F作用于它们(强制设置/阈值),则它们之间有足够F的2个点属于同一个集群。

我有一个代码,如下所示。使单元阵列CLUSTER包含群集分配。因此CLUSTER{i}是包含i群集的单元格,其中包含聚集点。

但是,对于某些F设置,实现需要永远。我已阅读有关预分配的内容,parforparfor无法完成,因为迭代中存在依赖关系)。但是,预先分配细胞阵列是否意味着单个细胞不会预先分配内存?还有其他方法吗?分析告诉我ismember在计算方面的份额最大。我希望通过您的建议改进代码。非常感谢!

CLUSTER = {};

for fi = 1:srow 
    for fj = 1:scol 
        if fj > fi % to eliminate redundancy, diagonal mirror elements of F !check on this 
            if F(fi,fj) >= 2000 % Force setting    
                if( (~ismember(1,cellfun(@(x)ismember(fi,x),CLUSTER))) && (~ismember(1,cellfun(@(x)ismember(fj,x),CLUSTER))) ) % fi & fj are not in CLUSTER
                    CLUSTER{end+1} = [fi fj];
                    end
                %%if( (ismember(1,cellfun(@(x)ismember(fi,x),CLUSTER))) && (ismember(1,cellfun(@(x)ismember(fj,x),CLUSTER))) ) % fi & fj are in CLUSTER   
                    %do nothing since lfi and fj are in CLUSTER    
                %%end    
                if( (ismember(1,cellfun(@(x)ismember(fi,x),CLUSTER))) && (~ismember(1,cellfun(@(x)ismember(fj,x),CLUSTER))) ) % fi in CLUSTER, fj not in CLUSTER
                    c = find(cellfun(@(x)ismember(fi,x),CLUSTER));
                    CLUSTER{c} = [CLUSTER{c} fj];
                end        
                if( (~ismember(1,cellfun(@(x)ismember(fi,x),CLUSTER))) && (ismember(1,cellfun(@(x)ismember(fj,x),CLUSTER))) ) % fi not in CLUSTER, fj in CLUSTER
                    c = find(cellfun(@(x)ismember(fj,x),CLUSTER));
                    CLUSTER{c} = [CLUSTER{c} fi];
                end
            end
        end
    end
end

1 个答案:

答案 0 :(得分:0)

我不确定这是否是最好的方式,但我的想法是,这应该可以通过某种更新算法来实现。首先查看节点1.查找与节点1聚集的所有节点,

clusteredNbr = find(F(1,:)>=2000); (a)

这将为您提供与节点1集群的所有节点的节点号。然后通过为所有新节点重复clusteredNbr来查找与(a)集群的所有节点。然后可以将这些节点添加到与clusteredNbr中的旧节点相同的向量中。您可能在此处有一些重复项,但可以在以后删除它们。然后检查此结果向量中的新唯一节点。如果有,请重复(a)。继续,直到找到第一个群集中的所有节点。然后,您知道第一个集群中的任何节点都没有与其他节点集群。

对下一个群集重复此过程,依此类推。这样做的好处是你可以使用find而不是ismember,并且操作可以进行矢量化,这样你就可以只运行一个for循环。