2012-03-19 2 views
1

필자는 문서에서 제공되는 간단한 예제로 인해 matlab에 대한 생각의 벡터화 방법을 얻지 못한다. 누군가가 나를 좀 더 잘 이해할 수 있기를 바랍니다.벡터화 코드

그래서, 내가 달성하고자하는 것은 ncols x 행렬에서 NxN 샘플을 취하여 x ielements를 제외하고 각 ielement에 대한 평균을 계산하고 평균의 최대 값을 저장하는 것입니다. 루프를 사용하여 코드는 다음과 같습니다

for x = 1+margin : nrows-margin 
    for y = 1+margin : ncols-margin 
     for i=1:ielem 
      % take a NxN sample 
      sample = input_matrix(y-margin:y+margin,x-margin:x+margin,i) 
      % compute the average of all elements 
      result(i) = mean2(sample); 
     end %for i 
     % store the max of the computed averages 
     output_matrix(y,x)=max(result); 
     end %for y 
    end %for x 

사람은 상황이 예제의 좋은 벡터화 할 수 있습니까? T

+0

아마도'conv2' 또는'filter2' 함수를보아야합니다. –

+0

그래도 conv2 나 filter2와 같은 함수를 사용하여 이러한 유형의 코드를 withouth로 벡터화하고 더 많은 행렬 인덱싱을 사용하는 다른 방법이 있습니까? – VisLab

답변

2

우선 벡터 라이 제이션은 실행되기 전에 코드를 컴파일하는 기능 향상으로 인해 그다지 중요하지 않지만 매우 일반적인 관행이며 몇 가지 기능 향상을 가져올 수 있습니다. 구식 Matlab 버전은 한 번에 한 줄씩 실행되므로 for 루프는 동일한 코드의 벡터화 된 버전보다 훨씬 느리게 진행됩니다.

벡터화 할 수있는 매트릭스 부분은 내부 for more 루프입니다. 당신이하려고하는 것에 대한 간단한 예제를 보여 드리겠습니다. 예제를 가져 와서 코드에 넣도록하겠습니다.

input=randn(5,5,3); 
max(mean(mean(input,1),2)) 

기본적 내측 두 mean 입력 어레이의 평균값을, 외측 max의 범위에서 최대 값을 찾는 것이다. 원한다면 단계별로 해체하고 그 내용을 확인하십시오. mean(input,1)은 첫 번째 차원에서 평균을 취하고 두 번째 차원에서 mean(input,2) 등을 취합니다. 처음 두 가지 방법을 수행 한 후에는 최대 함수가 쉽게 작동하는 벡터 만 남았습니다. 벡터 pre-max의 크기는 [1 1 3]이며이 작업을 수행 할 때 차원이 유지된다는 점에 유의해야합니다.