1

我有一个矩阵,其第一列为 X,第二列为 Y,第三列为 Z(来自地球的点云)。它们之间是异常值,即非常向下或非常外部的点(由于系统误差)。我创建一个距离矩阵并使用以下代码计算每个点到所有其他点的距离:

xl = selected(:,1);
yl = selected(:,2);
zl = selected(:,3);
distanceMatrix = zeros(size(selected,1));
x = [xl(:)'; yl(:)'; zl(:)'];
IP = x' * x;
distanceMatrix = sqrt(bsxfun(@plus, diag(IP), diag(IP)') - 2 * IP);

selectedl是我的矩阵。并计算每个点的邻居并说:只有 1 或 2 个邻居的点是异常值。但是:由于我的矩阵太大(考虑矩阵的大小),我的笔记本电脑无法处理(内存不足:4G!)

是否有一种方法、函数或代码可以在不计算距离矩阵的情况下自动计算异常值?

4

1 回答 1

1

您的代码可以提高效率。首先,请注意您x的只是selected'. 其次,您的所有代码都可以替换为:

distanceMatrix = squareform(pdist(selected));

(参见pdist和的文档squareform)。除了使代码更简单之外,这可能有助于减少内存使用。

如果内存仍然是一个问题,您可能必须分块工作,计算从当前块中的点到所有点的距离。您可以使用pdist2(它的通用版本pdist允许两个不同的输入并且不需要squareform):

chunkSize = 100; %// use largest value your memory permits; here it is
%// assumed to divide size(selected,1)
for ii = chunkSize:chunkSize:size(selected,1)
    ind = ii + (-chunkSize+1:0); %// indices of points in current chunk
    distanceMatrix = pdist2(selected,selected(ind,:)); %// distance from points
    %// in current chunk to all points

    %// Decide which points of the current chunk are outliers, based on
    %// computed distanceMatrix
end
于 2013-12-01T16:12:54.697 回答