2016-10-04 3 views
0

Matlab에서 Microsoft Kinect로 캡처 한 3D 점 구름에서 그래프를 만들고 싶습니다. 약 100K 포인트에 불과합니다.Matlab에서 O (n^2) 및 O (n^3) 증가 spurs 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 초가 걸릴 I는 다음과 같이, 즉 O (N^2)에만 중첩 매우 간단한 프로그램을 작성! 나는 그것을 실행

의 MATLAB 2016a 윈도우 10 기업 64 비트

인텔 코어 i7-3820이 속도에서 16기가바이트 RAM

3.6 GHz의

@, 그럴 수 없어 O (n^3)에 대해서도 생각해보십시오.

전체 프로그램을 1 미만으로 실행하고 싶습니다. 위의 프로그램을 테스트하기 전에 0.1 초 미만으로 실행할 것으로 예상됩니다.

편집 1 :

1) 두 사용자가 XY에 대해 언급! 포인트로부터 가중 그래프 (데이터 구조)를 만들고이 그래프를 사용하여 객체 (크기, 위치, 방향)를 찾고 싶습니다.

2) 한 사용자가 벡터화 계산에 댓글을 달았습니다. 매우 좋습니다. 그러나 PC에는 16GB RAM 만 있습니다. n ~ 100K로 계산을 벡터화하려면 128GB가 필요합니다!

3) O (n^2) 표기법 및 실행 시간에 대한 다른 사용자 의견. O (n^3)의 모든 peogram은 단지 loop보다 많은 시간이 걸립니다. 나는 단순한 루프가 122 초 걸릴 때 더 많은 라인을 추가하면 122 초 이상 걸린다 고 말하고 싶다. 0.1 초로 줄여야합니다 (최대 1 초까지 가능하지 않은 경우)

+2

실제로 무엇을하고 싶습니까? 지금은 각 반복에서 동일한 세 변수 만 덮어 씁니다. – 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-1 점을 모두 비교해야합니까? 또는 서로 상대적으로 가까운 쌍의 점을 처리하는 것으로 충분합니까? 대부분의 물리적 현상은 분리가 증가함에 따라 급격히 감소하므로 먼 지점의 효과를 무시하거나 많은 수의 먼 지점의 결합 효과를 모두가 한 방향과 거리에있는 것처럼 생각할 수도 있습니다.

먼 지점을 효율적으로 클러스터링 할 수있는 동시에 가까운 지점을 효율적으로 찾을 수있는 옥타브와 같은 데이터 구조를 살펴보십시오.