矢量化加权和matlab
Vectorize weighted sum matlab
我试图对某个加权和进行矢量化,但不知道该怎么做。我在下面创建了一个简单的最小工作示例。我想解决方案涉及 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;
您可以结合使用 bsxfun
、reshape
和 permute
来完成此操作。
我们首先使用permute
将N
维度移动到A
的第3维度。然后我们将 w1
和 w2
的转置相乘以创建权重网格。然后,我们可以使用 bsxfun
在该网格与 A
的每个 "slice" 之间执行逐元素乘法 (@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 和 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;
您可以结合使用 bsxfun
、reshape
和 permute
来完成此操作。
我们首先使用permute
将N
维度移动到A
的第3维度。然后我们将 w1
和 w2
的转置相乘以创建权重网格。然后,我们可以使用 bsxfun
在该网格与 A
的每个 "slice" 之间执行逐元素乘法 (@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);