2012-12-31 1 views
3

나는 단조 행에 걸쳐 증가하는 인덱스 번호가 포함 MATLAB에 큰 행렬에 노력하고있어 및 열 걸쳐, 즉 매트릭스, A를 호출하는 경우와 A(i,j+1) > A(i,j).MATLAB : 몬테카를로 시뮬레이션을위한 큰 행렬을 인덱싱 모든 <code>(i,j)</code>, <code>A(i+1,j) > A(i,j)</code>에 대한

랜덤 넘버 n을 생성하고 그것을 매트릭스 A의 값과 비교하여 그 랜덤 넘버가 매트릭스 A에 어디에 위치해야 하는지를 알아야합니다. 즉, n의 값은 행렬의 내용이지만 두 행과 두 열 사이에있을 수 있으며 A에서 위치를 식별하는 "빈"을 결정합니다.이 위치를 찾으면 새로운 행렬의 해당 색인을 증가시킵니다. A와 같은 크기입니다.

문제는 제가 이것을 1,000,000 번하고 싶다는 것입니다. 나는 무작위 수를 백만 번 만들고이 수의 각각에 대해 색인 검사를 수행해야합니다. 몬테카를로 (Monte Carlo) 스크린 상에 상륙하는 지점으로부터 오는 백만 광자의 시뮬레이션입니다. 행렬 A는 구 좌표계의 각으로 구성되며 난수는 각 입사 광자의 입체각입니다.

내 코드는 지금까지 이런 식으로 뭔가를 (세부 사항은 중요하지 않기 때문에 내가 여기에 복사 - 붙여 넣기하지 않은) 이동 :

for k = 1:1000000 
    n = rand(1,1)*pi; 
    for i = length(A(:,1)) 
     for j = length(A(1,:)) 
      if (n > A(i-1,j)) && (n < A(i+1,j)) && (n > A(i,j-1)) && (n < A(i,j+1)) 

       new_img(i,j) = new_img(i,j) + 1; % new_img defined previously as zeros 

      end 
     end 
    end 
end 

문은 인덱스를 찾아 확인하는 중입니다 "만일" n의 범위를 형성하는 A의

이것은 완벽하게 정상적으로 작동하지만 특히 행렬 A가 크기 11856 x 11000의 이미지이므로 엄청나게 오래 걸립니다.이 작업을보다 빠르고 쉽게 수행 할 수있는 방법이 있습니까?

미리 감사드립니다.

+0

코드가있는 그대로는 범위를 벗어나는 인덱스가 'A'로 잘못됩니다. – Jonas

+0

네가 맞아. 고마워. 내 실제 코드는이를 고려합니다. 나는 그저 요점을 알아 내고 싶었다. – Shash

+0

또한 "증가"횟수만큼 증가분을 계량해서는 안됩니까? 그렇지 않으면, 광자는 각도가 커질수록 커집니다. – Jonas

답변

2

A의 모든 요소에 대한 계산을 한 번에 수행하여 내부 루프를 제거 할 수 있습니다. 또한 한 번에 하나씩 생성하는 대신 난수를 생성 할 수 있습니다. new_img의 가장 바깥 쪽 픽셀은 0이 될 수 없습니다.

randomNumbers = rand(1,1000000)*pi; 
new_img = zeros(size(A)); 
tmp_img = zeros(size(A)-2); 

for r = randomNumbers 
    tmp_img = tmp_img + A(:,1:end-2)<r & A(:,3:end)>r & A(1:end-1,:)<r & A(3:end,:)>r; 
end 

new_img(2:end-1,2:end-1) = tmp_img; 

옆으로/: 배열이 작다면, 나는 비교 bsxfun을 사용하고 싶지만, 영업에 배열의 크기와, 접근 방식은 메모리가 부족합니다.

+0

감사합니다. 난수를 통해 반복을 피하면서 이것을하는 방법이 있습니까? 그것은 항상 먹는 것입니다. – Shash

+0

난수를 반복하지 않으면 많은 메모리가 필요합니다. 기본적으로 imageSize-by- # randomNumbers 배열을 만듭니다. 나는 그것이 귀하의 경우에 실현 가능하다고 생각하지 않습니다. – Jonas

+0

@shash : 그러나 'A'의 구조에 대해 더 많이 알려주면 더 똑똑한 해결책이 될 수 있습니다. 'A'는 어떻게 만드나요? – Jonas

1

다음은 내부 루프에서 많은 도움이되는 스 니펫입니다. value보다 작은 가장 큰 점의 위치를 ​​찾습니다.

idx1 = A<value 
idx2 = A(idx1) == max(A(idx1)) 

find으로 포장 할 정확한 위치를 찾고 싶다면.

+0

1D에서는 작동하지만 2D 위치에서는 작동하지 않습니다. – Jonas

+0

@ Jonas 왜 2D로 작동하지 않을지 모르겠습니다. idx2에서 점을 발견하면 새로운 값이 그 값에서 오른쪽이나 아래에있을 수 있습니다. –

2

A bin 가장자리의 값이 있습니까? 예 : A 그리드를 지정합니까? 이 경우라면 hist3을 사용하여 A를 신속하게 채울 수 있습니다.

다음은 예입니다. numRand = 1e n = randi (100,1e6,1); nMatrix = [floor (data./10), mod (data, 10)];

edges = {0:1:9, 0:10:99}; 

A = hist3(dataMat, edges); 

당신의 A 그리드를 지정하지 않는 경우, 당신은 한 번 임의의 모든 값을 만들고으로 정렬한다. 그런 다음 그 값을 반복합니다.

n(i) >= n(i-1)을 알고 있으므로 n(i-1)에 비해 너무 작은 용지함을 확인할 필요가 없습니다. 이것은 대부분의 중복 검사를 최적화하는 아주 쉬운 방법입니다.

+0

감사합니다. 이것은 매우 유용했습니다. – Shash

관련 문제