矢量化加权和matlab

时间:2016-08-23 18:53:19

标签: matlab vectorization weighted-average

我试图对某个加权和进行矢量化但却无法弄清楚如何去做。我在下面创建了一个简单的最小工作示例。我想这个解决方案涉及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;

1 个答案:

答案 0 :(得分:3)

您可以使用bsxfunreshapepermute的组合来完成此任务。

我们首先使用permuteN维度移至A的第三维。然后,我们将w1w2的转置相乘以创建权重网格。然后我们可以使用bsxfun在此网格和每个"切片之间执行逐元素乘法(@times)。 A。然后我们可以将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);