块矩阵中块的有效逐点乘法

时间:2014-07-04 14:02:44

标签: matlab

考虑具有2D块的两个ND块矩阵。为简单起见,请考虑2D矩阵[A B; C D][E F; G H]。可以假设每个矩阵的子矩阵具有相同的大小。是否有一种有效的方法来确定矩阵[AE BF; CG DH],它类似于矩阵的逐点乘法,但现在处于各个块的级别。目前我使用三重for循环(一个在N维上,两个用于提取每个子块)并预先分配并且它可以工作,但它仍然是我当前应用程序中真正的性能杀手。我知道它可以通过使用单元阵列和cellfun轻松完成,但我更喜欢没有的解决方案。是否有另一种有效的方法来执行此类操作?

修改

下面的算法显示了预期的行为。在所考虑的应用程序中,块大小甚至更小,这使得计算更慢。

x = randn(100, 100, 50, 50);
blksize_x = [5, 5];
y = randn(100, 80, 50, 50);
blksize_y = [5, 4];
sx = size(x); sy = size(y);
c = zeros([sx(1), sy(2), prod(sy(3:end))]);

for i=1:prod(sy(3:end))
    for j=1:sx(1) / blksize_x(1) 
        for k=1:sx(2) / blksize_x(2)
            ix1 = (j - 1) * blksize_x(1) + 1:j * blksize_x(1);
            ix2 = (k - 1) * blksize_x(2) + 1:k * blksize_x(2);
            iy1 = (j - 1) * blksize_y(1) + 1:j * blksize_y(1);
            iy2 = (k - 1) * blksize_y(2) + 1:k * blksize_y(2);
            c(ix1, iy2, i) = x(ix1, ix2, i) * y(iy1, iy2, i);
        end
    end
end
c = reshape(c, [sx(1), sy(2:end)]);

0 个答案:

没有答案