【问题标题】:Increasing speead of O(n^2) and O(n^3) in Matlab when n ~ 100K当 n ~ 100K 时,在 Matlab 中增加 O(n^2) 和 O(n^3) 的传播
【发布时间】:2017-02-13 03:51:30
【问题描述】:

我想根据 Microsoft Kinect 在 Matlab 中捕获的 3D 点云创建一个图形。大约只有 100K 点。我写了一个非常简单的程序,它只是一个嵌套的,即 O(n^2) 如下:

load('Points_Sample1.mat')
Points=single(Points);
x=Points(1,:);
y=Points(2,:);
z=Points(3,:);

tic
for i=1:n
    xi=x(i);
    yi=y(i);
    zi=z(i);
   for j=1:n
        xj=x(j);
        yj=y(j);
        zj=z(j);
   end
end
toc

结果是:

Elapsed time is 122.398886 seconds.

换句话说,一个简单的 for 循环需要 122 秒!我运行它:

Matlab 2016a

Windows 10 企业版 64 位

Intel Core i7-3820 @ 3.6 GHz,16 GB RAM

以这种速度,我什至无法考虑 O(n^3)

我想在不到 1 秒的时间内运行整个程序。在测试上述程序之前,我预计运行时间少于 0.1 秒。

编辑 1:

1) 两个用户评论了 XY!我想从点创建加权图(数据结构)并使用该图来查找对象(大小、位置、方向)。

2) 一位用户对矢量化计算进行了计算,非常好。但是,这台电脑只有 16GB 的 RAM。 n~100K 的向量化计算需要 128GB!

3) O(n^2) 表示法和运行时间的其他用户 cmets。 O(n^3) 中的任何 peogram 都应该比仅仅循环花费更多的时间。我想说的是,当 nly 简单循环需要 122 秒时,如果我添加更多行,则需要超过 122 秒。我需要将其减少到 0.1 秒(如果不可能,最多 1 秒)

【问题讨论】:

  • 你真正想做什么?现在您只需在每次迭代中覆盖相同的三个变量。
  • 如果你不能避免大循环并且速度对你很重要,也许 Matlab 不是你可以选择的最好的编程语言。在大多数情况下,您可以部分或完全矢量化您的计算,从而显着提高速度。如果您不知道如何向量化计算,您可以check this page 或编辑您的问题并分享您在循环中执行的一些操作。
  • 旁注:O 表示法并不能告诉您算法的运行速度,而是它如何随输入扩展。您可以创建一个O(n) 的算法并花费 milenia 来计算,以及一个O(n^2) 的算法并以毫秒为单位工作。 O 符号有助于了解一旦您以 1 个数组大小运行算法,与不同大小的数组相比需要多少。
  • 也就是说,我会改写问题,因为您只是假设 2 个循环-> O(n^2) -> 每个 O(n^2) 将花费相同的时间,也就是说,完全错误.把你想用的代码放好,帮助优化
  • 补充我尊敬的同事的话,请阅读(并注意)XY Problem 并确保您没有踩到那个耙子......

标签: matlab kinect point-clouds


【解决方案1】:

您真的需要将所有 N 个点与所有 N-1 个其他点进行比较吗?或者处理彼此相对较近的点对就足够了吗?大多数物理现象随着距离的增加而迅速减少,因此您可以忽略远距离点的影响,或者将大量远距离点的组合效应视为它们都位于一个方向和距离上。

看看八叉树等数据结构,它们可以有效地找到附近的点,同时将远处的点分组到集群中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 2020-11-29
    • 2012-11-22
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多