2016-10-04 3 views
0

MatlabのMicrosoft Kinectでキャプチャした3D点群からグラフを作成したい。約100Kポイントにすぎません。MatlabのO(n^2)とO(n^3)のスピードをn〜100Kの間に増加させる

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. 

ループのためのシンプルでは122秒を要し、私は以下のように、すなわちO(N^2)の場合のみ、ネストされた非常に簡単なプログラムを書きました!私はそれを実行します。この速度で16ギガバイトのRAM

Matlabの2016a

のWindows 10エンタープライズ64ビット

インテルCore i7-3820 3.6 @ GHzの、私はできませんO(n^3)についても考えてください

私は1s以下のプログラム全体を実行したいと思います。上記プログラムをテストする前に、私は0.1秒未満で動作すると予想していました。

編集1:

1)2人のユーザーがXYについてコメント!私は、ポイントから重み付きグラフ(データ構造)を作成し、このグラフを使用してオブジェクト(サイズ、位置、方向)を見つけたいと考えています。

2)1人のユーザーがベクトル化計算についてコメントしています。ただし、PCには16GBのRAMしかありません。 n〜100Kのベクトル化計算には128GBが必要です!

3)O(n^2)表記と実行時間に関する他のユーザーからのコメント。 O(n^3)のピオグラムは単なるループよりも時間がかかるはずです。私は単純なループが122秒かかると言いたいのですが、それ以上の回線を追加すると、122秒以上かかることになります。 0.1秒に減らす必要があります(できるだけ1秒以内にはできません)

+2

実際に何をしたいですか?今は、各繰り返しで同じ3つの変数のみを上書きします。 – hbaderts

+0

大きなループを避けて問題をスピードアップできない場合、Matlabはあなたが選ぶことのできる最高のプログラミング言語ではないかもしれません。ほとんどの場合、計算を部分的または完全にベクトル化して速度を大幅に向上させることができます。計算をベクトル化する方法がわからない場合は、[このページをチェック](https://www.mathworks.com/help/matlab/matlab_prog/vectorization.html)または質問を編集して、ループでやっている。 – erfan

+1

サイドノート: 'O'表記は、アルゴリズムの速さを教えてくれるわけではありませんが、入力とどのように比例するのかを教えてくれます。あなたは 'O(n)'であり、mileniaを計算するアルゴリズムと、 'O(n^2)'でありミリ秒で動作するアルゴリズムを作ることができます。 'O'表記法は、一度アルゴリズムを1つの配列サイズで実行すると、異なるサイズの配列と比較してどのくらいの量がかかるかを知るのに便利です。 –

答えて

0

本当にすべてのN点を他のN-1点と比較する必要はありますか?または、互いに比較的近い点のペアを処理するだけで十分ですか?多くの物理現象は、分離が進むにつれて急速に減少するため、離れた点の影響を無視するか、まるでそれらがすべて単一の方向と距離にあるかのように、多数の遠方点の複合効果を考慮することができます。

遠方ポイントをクラスタにグループ化しながら、近くの点を効率的に見つけることができるオクトツリーなどのデータ構造を見てください。

関連する問題