我有一个尺寸为(x,y,N)的3D矩阵和一个尺寸为(N,N)的2D矩阵。
我想以这样的方式操纵这两者:2D矩阵中的每列具有用于3D矩阵中的2D尺寸(x,y)切片的线性组合的系数。我想对2D矩阵中的所有N列执行此操作。
示意性地,
目前代码如下:
A = zeros(numel(x_axis), numel(y_axis), N);
B = zeros(numel(x_axis), numel(y_axis), N);
C = zeros(N, N)
for i = 1 : N
for j = 1 : N
A(:,:,i) = A(:,:,i) + B(:,:,j) * C(j,i);
end
end
但它很慢。有没有办法通过矢量化来加速MATLAB代码?
答案 0 :(得分:2)
您可以使用bsxfun
来快速计算。我们必须使用permute
稍微重新安排C
以确保它具有符合使用bsxfun
的尺寸,然后我们在结果输出的第三维上执行求和应用squeeze
删除单身第三维。
A = squeeze(sum(bsxfun(@times, B, permute(C, [3 4 1 2])), 3))
答案 1 :(得分:2)
如果我理解你的问题,那么这应该有效:
[p,q,N] = size(B);
A = reshape( reshape(B, [p*q, N]) * C, [p, q, N]);
修改:Suever建议的清洁版:
A = reshape(reshape(B, [], size(B, 3)) * C, size(B))
对R-D案例的推广:
A = reshape(reshape(B, [], size(B, ndims(B))) * C, size(B))