我有以下问题。
for i=1:3000
[~,dist(i,1)]=knnsearch(C(selectedIndices,:),C);
end
让我解释一下上面的代码。矩阵C是一个巨大的矩阵(300000 x 1984)
。 C(selectedIndices,:)
是C的100个元素的子集,具体取决于i
的值。这意味着:对于i=1
,会选择前100个C点,对于i==2
,会选择C(101:200,:)
。如您所见,第二个参数保持不变。
有没有办法让这项工作更快。我尝试过以下方法:
- [~,dist(i,1)]=knnsearch(C,C); %obviously goes out of memory
发送更大的selectedIndices
块而不是仅发送100个。这增加了一些我不担心的后处理。但这不起作用,因为它需要相同的时间。例如,如果我一次发送100个C点,则需要60秒。如果我发送500,则后处理需要380秒。
尝试使用parfor
:不同的selectedIndices
组将并行执行。它不起作用,因为可能已经创建了两个大矩阵C
的副本(不确定parfor是如何工作的),但我确信计算机变得非常慢,反过来否定了parfor的优势。
尚未尝试:将两个参数分解为较小的块并将其发送到parfor中。你认为这会有什么不同吗?
我对任何建议持开放态度,即如果你觉得以某种不同的方式制动矩阵可能会加快计算速度,那就建议一下。因为,最后我只关心从C中的每个点找到一组点的最近点(这里每组有100个点)。