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秒以内にはできません)
実際に何をしたいですか?今は、各繰り返しで同じ3つの変数のみを上書きします。 – hbaderts
大きなループを避けて問題をスピードアップできない場合、Matlabはあなたが選ぶことのできる最高のプログラミング言語ではないかもしれません。ほとんどの場合、計算を部分的または完全にベクトル化して速度を大幅に向上させることができます。計算をベクトル化する方法がわからない場合は、[このページをチェック](https://www.mathworks.com/help/matlab/matlab_prog/vectorization.html)または質問を編集して、ループでやっている。 – erfan
サイドノート: 'O'表記は、アルゴリズムの速さを教えてくれるわけではありませんが、入力とどのように比例するのかを教えてくれます。あなたは 'O(n)'であり、mileniaを計算するアルゴリズムと、 'O(n^2)'でありミリ秒で動作するアルゴリズムを作ることができます。 'O'表記法は、一度アルゴリズムを1つの配列サイズで実行すると、異なるサイズの配列と比較してどのくらいの量がかかるかを知るのに便利です。 –