2013-05-30 50 views
2

我想將sph2cart返回的數據組織爲帶有向量元素的矩陣,並對此矩陣(向量向量或向量標量計算)中的每個元素進行操作。這裏是我實現這個的一個例子:向量化在3D矩陣上運行的代碼

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