我想知道如何有效地运行我的程序的这一部分。基本上为了我的目标,我想集中点。有大约10,000点。这些点已计算出#34; force"它们之间存储在矩阵F
中。所以第1点和第2点之间的力是F(1,2)
。然后我想和#34;聚集点"如果有足够F
作用于它们(强制设置/阈值),则它们之间有足够F
的2个点属于同一个集群。
我有一个代码,如下所示。使单元阵列CLUSTER
包含群集分配。因此CLUSTER{i}
是包含i
群集的单元格,其中包含聚集点。
但是,对于某些F
设置,实现需要永远。我已阅读有关预分配的内容,parfor
(parfor
无法完成,因为迭代中存在依赖关系)。但是,预先分配细胞阵列是否意味着单个细胞不会预先分配内存?还有其他方法吗?分析告诉我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
答案 0 :(得分:0)
我不确定这是否是最好的方式,但我的想法是,这应该可以通过某种更新算法来实现。首先查看节点1.查找与节点1聚集的所有节点,
clusteredNbr = find(F(1,:)>=2000); (a)
这将为您提供与节点1集群的所有节点的节点号。然后通过为所有新节点重复clusteredNbr
来查找与(a)
集群的所有节点。然后可以将这些节点添加到与clusteredNbr
中的旧节点相同的向量中。您可能在此处有一些重复项,但可以在以后删除它们。然后检查此结果向量中的新唯一节点。如果有,请重复(a)
。继续,直到找到第一个群集中的所有节点。然后,您知道第一个集群中的任何节点都没有与其他节点集群。
对下一个群集重复此过程,依此类推。这样做的好处是你可以使用find
而不是ismember
,并且操作可以进行矢量化,这样你就可以只运行一个for循环。