2

我有以下问题。

for i=1:3000
    [~,dist(i,1)]=knnsearch(C(selectedIndices,:),C);
end

让我解释一下上面的代码。矩阵 C 是一个巨大的矩阵(300000 x 1984)C(selectedIndices,:)是 C 的 100 个元素的子集,具体取决于 的值i。这意味着: 对于i=1,选择 C ​​的前 100 个点,对于i==2C(101:200,:)被选择。如您所见,第二个参数保持不变。

有什么办法可以让这项工作更快。我尝试了以下方法:

-  [~,dist(i,1)]=knnsearch(C,C); %obviously goes out of memory
  • 发送更大的块selectedIndices而不是只发送 100 个。这增加了一点我不担心的后期处理。但这不起作用,因为它需要相同的时间。例如,如果我一次发送 100 个 C 点,则需要 60 秒。如果我发送 500,则后处理需要 380 秒。

  • 尝试使用parforas:不同的集合selectedIndices将并行执行。它不起作用,因为C可能已经创建了两个大矩阵副本(不确定 parfor 是如何工作的),但我确信计算机会变得非常慢,从而否定 parfor 的优势。

  • 还没有尝试过:将两个参数分成更小的块并将其发送到 parfor。你认为这会有什么不同吗?

我对任何建议持开放态度,即如果您觉得以某种不同的方式制动矩阵可能会加快计算速度,请提出建议。因为,最后我只关心从 C 中的每个点的一组点(这里每组有 100 个点)中找到最近的点。

4

0 回答 0