2013-05-30 1 views
2

sph2cart에 의해 반환 된 데이터를 벡터 요소가있는 행렬로 구성하고이 행렬의 각 요소 (벡터 - 벡터 또는 벡터 - 스칼라 계산)에서 작동합니다. 다음은이를 달성 한 예입니다.3-D 행렬에서 작동하는 벡터화 코드

lightV = zeros(1, 1, 3); 
lightV(1,1,1) = 0.5; 
lightV(1,1,2) = 0.4; 
lightV(1,1,3) = 0.7; 
[Az El] = meshgrid(0:60:360, 0:15:90); 
[x y z] = sph2cart(Az*pi/180, El*pi/180, 1); 
refV = zeros(size(Az,1), size(Az,2), 3); 
radius = zeros(size(Az,1), size(Az,2)); 
for i = 1:size(Az,1) 
    for j = 1:size(Az,2) 
     refV(i,j,1) = -x(i,j); 
     refV(i,j,2) = -y(i,j); 
     refV(i,j,3) = z(i,j); 
     radius(i,j) = dot(refV(i,j,:), lightV(1,1,:)); 
    end 
end 

그러나이 내용은 다소 중복되어 있는데 어떻게하면 더 간결하게 만들 수 있습니까?

답변

0

글쎄, 당신은과 같이 코드를 벡터화 할 수 있습니다

S.lightV = [0.5, 0.4, 0.7]; 
[Az, El] = meshgrid(0:60:360, 0:15:90); 
[S.x, S.y, S.z] = sph2cart(Az * pi/180, El * pi/180, 1); 
S.refV = cat(3, -x, -y, z); 
S.radius = sum(bsxfun(@times, S.refV, reshape(S.lightV, 1, 1, [])), 3); 

cat의 사용이 세 번째 차원을 따라 연결하는 주 및 bsxfunsum의 조합이 루프 중첩 된 내부의 내적을 교체 . 또한 하나의 구조체에 모든 것을 묶었습니다 S.

+0

구조체도 비슷한 기능을 지원합니까? 이러한 모든 데이터는 방향을 암시하기 때문에 .x .y .z 필드가있는 구조체로 변환하여 코드를 읽기 쉽도록 만들고 싶습니다. – Seila

+0

물론 그렇지만 꽤 읽기 쉽습니다. 구조체를 사용하는 답을 수정했습니다. –

+1

예, 정말 고마워요! – Seila