【发布时间】: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