【问题标题】:Vectorize code that operates on 3-D matrices向量化在 3-D 矩阵上运行的代码
【发布时间】:2013-05-30 08:52:34
【问题描述】:

我想将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

但是这看起来有些多余,我怎样才能使它更简洁?

【问题讨论】:

    标签: matlab vectorization matrix-multiplication


    【解决方案1】:

    好吧,你可以像这样矢量化你的代码:

    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

    【讨论】:

    • struct 是否也支持类似的功能?由于所有这些数据都暗示了方向,我想将它们转换为带有 .x .y .z 字段的结构,以使我的代码更具可读性。
    • 当然,但它的可读性很好。我已修改答案以使用结构。
    猜你喜欢
    • 2013-06-07
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2019-04-25
    • 2018-07-18
    相关资源
    最近更新 更多