我有一个 block 矩阵[A B C...]
和一个矩阵D(都是二维的)。 D 的尺寸为 y×y,A、B、C 等均为 z×y。基本上,我想要计算的是矩阵 [D*(A'); D B'); D*(C');...]
,其中 X' 指 X 的转置。但是,出于速度考虑,我想在没有循环的情况下完成此操作。
我已经使用 reshape 命令几个小时了,我知道如何在其他情况下使用它,但这个用例与其他用例不同,我无法弄清楚。如果可能的话,我还想避免使用多维矩阵。
最佳答案
老实说,循环可能是最好的方法。在我的图像处理工作中,我发现利用 Matlab 的 JIT 编译器编写良好的循环通常比处理数据以能够使用矢量化操作的所有额外开销更快。像这样的循环:
[m n] = size(A);
T = zeros(m, n);
AT = A';
for ii=1:m:n
T(:, ii:ii+m-1) = D * AT(ii:ii+m-1, :);
end
仅包含内置运算符和最少的复制,并且考虑到 JIT 将很难被击败。即使您想考虑解释器开销,它仍然只是一条语句,没有需要考虑的函数。
带有额外处理和内存复制的“无循环”版本是 split the matrix并使用 a hidden loop 迭代 block :
blksize = size(D, 1);
blkcnt = size(A, 2) / blksize;
blocks = mat2cell(A, blksize, repmat(blksize,1,blkcnt));
blocks = cellfun(@(x) D*x', blocks, 'UniformOutput', false);
T = cell2mat(blocks);
当然,如果您有权访问图像处理工具箱,您也可以cheat horribly :
T = blockproc(A, size(D), @(x) D*x.data');
关于MATLAB:无循环的 block 矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21357692/