【问题标题】:Vectorize weighted sum matlab向量化加权和 matlab
【发布时间】:2016-08-23 18:53:19
【问题描述】:

我试图对某个加权和进行矢量化,但不知道该怎么做。我在下面创建了一个简单的最小工作示例。我想解决方案涉及 bsxfun 或 reshape 和 kronecker 产品,但我仍然没有设法让它工作。

rng(1);
N = 200;
T1 = 5;
T2 = 7;

A = rand(N,T1,T2);
w1 = rand(T1,1);
w2 = rand(T2,1);

B = zeros(N,1);

for i = 1:N
for j1=1:T1
for j2=1:T2
    B(i) = B(i) + w1(j1) * w2(j2) * A(i,j1,j2);
end
end
end

A = B;

【问题讨论】:

    标签: matlab vectorization weighted-average


    【解决方案1】:

    您可以使用bsxfunreshapepermute 的组合来完成此操作。

    我们首先使用permuteN 维度移动到A 的第三维度。然后我们将w1w2 的转置相乘以创建一个权重网格。然后我们可以使用bsxfun 在这个网格和A 的每个“切片”之间执行逐元素乘法(@times)。然后我们可以将 3D 结果重新整形为 M x N 并在第一个维度上求和。

    B = sum(reshape(bsxfun(@times, w1 * w2.', permute(A, [2 3 1])), [], N)).';
    

    更新

    实际上有一种更简单的方法可以使用矩阵乘法为您执行求和。不幸的是它必须被分解成

    % Create the grid of weights
    W = w1 * w2.';
    
    % Perform matrix multiplication between a 2D version of A and the weights
    B = reshape(A, N, []) * W(:);
    

    或者您可以使用 kron 创建扁平的权重网格:

    B = reshape(A, N, []) * kron(w2, w1);
    

    【讨论】:

    • 哇。那很快。这完美地工作。我确实尝试过使用 bsxfun 和 reshape 但没有弄清楚。非常感谢你!我只能在 6 分钟内接受答案:)
    • 我稍微编辑了这个问题。答案是否容易概括为三维总和?
    • @volcompt 看起来这个解决方案非常适合您的 2D 加权问题,但实际上 3D 问题是另一回事。最好接受这个(如果它适合你的话)和ask a different question你的新问题。
    猜你喜欢
    • 2015-02-23
    • 1970-01-01
    • 2018-12-15
    • 2016-02-24
    • 1970-01-01
    • 2015-07-06
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多