三维矩阵MATLAB中切片的线性组合

时间:2017-02-06 16:25:36

标签: matlab matrix multidimensional-array vectorization linear

我有一个尺寸为(x,y,N)的3D矩阵和一个尺寸为(N,N)的2D矩阵。

我想以这样的方式操纵这两者:2D矩阵中的每列具有用于3D矩阵中的2D尺寸(x,y)切片的线性组合的系数。我想对2D矩阵中的所有N列执行此操作。

示意性地,

Schematic Picture Link

目前代码如下:

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代码?

2 个答案:

答案 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))