【发布时间】:2017-09-27 09:27:40
【问题描述】:
在 Matlab 中,我有两个包含坐标的相当大的矩阵(A 和 B)。两条线代表 x 和 y,每列代表一个笛卡尔坐标 (x;y)。
现在我想将矩阵 B 中距离矩阵 A 中任意点小于 1(米)的所有点存储在一个新矩阵中。
我可以遍历所有数据,但是非常耗时(矩阵为 2x800000)。
有什么方法可以提高性能?
这是我当前代码的结构:
new_vec = [0;0];
for i=1:length(A)
cur_x = A(1, i);
cur_y = A(2, i);
for j=1:length(B)
if B(2, j) <= cur_y + 1 && B(2, j) >= cur_y - 1 && ...
B(1, j) <= cur_x + 1 && B(1, j) >= cur_x - 1
new_vec = [new_vec, [B(1, j); B(2, j)]];
end
end
end
【问题讨论】:
-
现在您已经提供了代码,我看到您对“接近于 1”的定义包括对 x 和 y 的单独检查。这意味着您的点的距离可能为 sqrt(2) 并且不在范围内 - 这是故意的还是您更愿意使用直接 2D(欧几里得)距离?
-
这是故意的,但感谢您的提示
-
@m7913d 请注意,
pdist2可以使用,但对于这种大小的数据,我们只想知道任何距离是否小于 1,可能会更慢。他们还需要 x 和 y 坐标为 +/-1,而不是在 1 个单位内,因此可能需要以某种方式使用“城市街区距离” -
@Wolfie 您可以指定distance metric using
pdist2。cityblock是可用选项之一。 -
你有多少内存?坐标是整数还是双精度数?
标签: matlab performance matrix distance