2016-08-25 5 views
0

n 랜덤 포인트가 모두 1 인 큐브를 생성하려고합니다. 행렬을 사용하여 각 열이 (x,y,z) 큐브의 점이되도록 행렬을 사용하고 있습니다. 때때로 코드가 작동하고 때로는 작동하지 않습니다. 그 이유는 무엇인지 알 수 없습니다 ... 어떤 도움이나 조언도 코드의 입력은 큐브의 한 변의 길이와 사용하려는 포인트의 수입니다.최소 거리가있는 임의의 점 [옥타브]

업데이트 : 코드에 대한 설명 :
그래서이 3 열 및 n 행으로 임의의 행렬을 만들 예정이다. 큐브의 n 점의 좌표는 (x,y,z)입니다. 구속 조건은 큐브 lx의 크기와 점 사이의 최소 거리 d입니다. 그래서 내 코드는 nx3 랜덤 행렬을 생성하고 각 요소를 확인하여 거리가 적어도 1인지 확인합니다. 그렇지 않은 경우 해당 요소에 대해 새 점을 생성합니다. 그런 다음 다시 돌아가서 모든 이전 지점을 확인하여 해당 제한을 유지합니다. 일부 포인트의 거리가 1 미만이므로 실패합니다. 충분한 수표를 내지 못했는지 아니면 다른 것이 있는지 나는 모른다.

입력 값 : 큐브의

  • 길이 : 포인트 lx = 7.35
  • 번호 : n = 256

코드 :

function [A]=distribution(lx,n) 
    format long; 
    A=0; 
    new=0; 
    d=1; 
    A=rand(n,3).* [lx]; 
    A=reshape(A.' ,3,n); 
    while(new <= (n+1)) 
    for i=1:(n-1) 
     for j=(i+1):n 
      r=A(:,i) - A(:,j); 
      rsum= sum(dot(r,r)); 
      if(rsum < 1.0) 
       A(:,j)=rand(1,3).* [lx]; 
      end 
     end 
     for k=1:i-1 
      r2=A(:,k) - A(:,i); 
      r2sum= sum(dot(r2,r2)); 
      if(r2sum < 1.0) 
       A(:,j)=rand(3,1).* [lx]; 
      end 
     end 
    end 
    new=new +1; 
    endwhile 
    A=reshape(A.' ,n,[]); 
+0

"때로는 작동하고 때로는 작동하지 않습니다"를 발굴 할 수 작동하지 않을 경우 매우 모호합니다. 귀하의 코드는 무엇을하고 어떻게 정확히 실패합니까? – beaker

+0

그래서 3 개의 열과 N 개의 행이있는 임의의 행렬을 생성해야합니다. 이는 큐브의 점에 대한 XYZ 좌표를 나타냅니다. 제약 조건은 입방체의 크기 (lx)와 점 사이의 최소 거리 (d)입니다. 그래서 내 코드는 nx3 랜덤 행렬을 생성하고 각 요소를 확인하여 해당 요소의 새로운 점을 생성하지 않으면 거리가 최소 1인지 확인합니다. 그런 다음 다시 돌아가서 모든 이전 지점을 확인하여 해당 제한을 유지합니다. 일부 포인트의 거리가 1보다 작으므로 실패합니다. – Oppenheimer

+0

임의의 프로세스이므로 때때로 실패 할 것으로 예상됩니다. 입력 값으로 전달하는 값은 무엇입니까? [편집]을 클릭하여 원래 질문에 업데이트 나 설명을 추가하십시오. – beaker

답변

0

어떻게 무작위 포인트가 될 필요합니까 ? 가능한 해결책이 있지만, 모든 가능한 상태에 비해 거의 없습니다. 솔루션을 무작위로 치는 것은 무기한 오래 걸릴 수 있습니다.

나는 방법의 몇 가지 제안 할 수 있습니다 :

  1. 그리드에 포인트를 설정 한 다음 일부는 확장에 그들을 무작위. 포인트 단위로 좌표의 무작위 화를 적용하면 거리가 1 미만으로 떨어지면 변경 사항을 "실행 취소"할 수 있습니다.
  2. 허용되는 공간의 중심에 "초기"점부터 시작하십시오 "초기"지점에서 임의의 각도와 반경 1을 갖는 극좌표의 방법으로 점의 레이어를 추가합니다. 레이어를 추가하면 반경을 2로 늘리고 "초기"점을 원점으로 유지할 수 있습니다. 또는 마지막으로 추가 한 레이어의 점을 반복하고 비슷한 방식으로 새 레이어를 추가하십시오. 두 경우 모두 이전의 모든 점에 대해 거리를 확인해야합니다.

두 가지 방법 모두에서 최종 결과는 매우 랜덤하지 않습니다. 내가 진정으로 무작위적인 해결책을 얻으려면 그것을 보는 방법으로 옆면이 lx 인 상자에 256 개의 공을 확률 적으로 물리적으로 시뮬레이션하고 조금 흔들어야합니다.

+0

그것은 좋은 quesiton이다. .. 나는 그것이 얼마나 있어야하는지 명확히 명확하지 않다. 제대로 작동하려면 오랜 시간이 걸립니다. 상자 크기를 줄이고 입자를 동일하게 유지하면 시간이 지날수록 기하 급수적으로 증가합니다. 나는이 코드를 더 효율적으로 만들기 위해이 코드를 최적화 할 방법을 찾아야한다고 생각했습니다. 나는 분명히 당신의 접근법을 살펴보고 구현하려고 노력할 것입니다. – Oppenheimer

0

2D에서 이러한 문제는 푸 아송 디스크 배포 및 3D 포아송 구 분포에서 발생합니다. 이 문제에 대한 합리적인 좋은 해결책이 알려져 있으므로 paper을 확인하십시오.matlab에 here에서

기발한 작업 코드는, 그것이 내가 내 파이썬 구현

+0

제안 해 주셔서 감사합니다. 이 코드의 3D 버전을 사용해 보았는데 행렬 크기가 일치하지 않습니다. 256 X 3 매트릭스 대신 200, 207,216 x 3 매트릭스를 얻었고 왜 그렇게하는지 알 수 없었습니다. – Oppenheimer