矢量化在3-D矩阵上运行的代码

时间:2013-05-30 08:52:35

标签: matlab vectorization matrix-multiplication

我想将sph2cart返回的数据组织为带向量元素的矩阵,并对此矩阵中的每个元素进行操作(向量矢量或矢量标量计算)。以下是我实现这一目标的一个例子:

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

然而,这看起来有点多余,我怎么能让它更简洁呢?

1 个答案:

答案 0 :(得分: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的组合来替换嵌套for循环中的点积。我还将所有内容绑定在一个结构S中。