我有以下问题。
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==2
,C(101:200,:)
被选择。如您所见,第二个参数保持不变。
有什么办法可以让这项工作更快。我尝试了以下方法:
- [~,dist(i,1)]=knnsearch(C,C); %obviously goes out of memory
发送更大的块
selectedIndices
而不是只发送 100 个。这增加了一点我不担心的后期处理。但这不起作用,因为它需要相同的时间。例如,如果我一次发送 100 个 C 点,则需要 60 秒。如果我发送 500,则后处理需要 380 秒。尝试使用
parfor
as:不同的集合selectedIndices
将并行执行。它不起作用,因为C
可能已经创建了两个大矩阵副本(不确定 parfor 是如何工作的),但我确信计算机会变得非常慢,从而否定 parfor 的优势。还没有尝试过:将两个参数分成更小的块并将其发送到 parfor。你认为这会有什么不同吗?
我对任何建议持开放态度,即如果您觉得以某种不同的方式制动矩阵可能会加快计算速度,请提出建议。因为,最后我只关心从 C 中的每个点的一组点(这里每组有 100 个点)中找到最近的点。